漢諾塔遞歸演算法python
Ⅰ 給小孩學編程有必要嗎(少兒編程到底要不要學)
果果進入小學以後,周圍人關於要不要學編程,什麼時候開始學的討論越來越多了,
特別是藝體類特長生取消後新增了科技特長生,
這架勢一出,之前的各路牛娃們紛紛由奧數轉向信奧。
說實在的,我也曾不只一次考慮要不要給果果報個編程課試試。
那是什麼阻止了我呢?
簡單來說就是娃沒時間,
我們如今把運動放在了首位,每天放學後的一個小時花在了運動上,周末每天最少3個小時都在運動(加上來迴路上時間,5個小時打底),
但凡有點空閑時間,娃自己還想做點手工,畫畫,看點自己喜歡的書什麼的,實在是沒時間再加一門編程了。
娃沒時間,我有時間的時候,我時不時就在b站聽幾耳朵python基礎,HTML+CSS, JAVA什麼的。
倒不是准備自己學了教娃,而是想了解下編程到底是個啥,以及我娃到底適不適合學。
經過這陣子的簡單了解,我對娃要不要學編程,以及什麼時候學,有了新的理解。
這一篇,就來和大家分享一些我的一些不成熟的小想法。
對於不同年齡段的孩子和家庭,大家對編程的理解和大致印象是不一樣的。
01
學齡前:編程玩具和編程思維
比如學齡前家庭,一提起編程,大家想起來的基本都是各種編程玩具,
這些玩具,基本也就實現一兩個編程理念或概念,
比如:路徑設計,路徑循環,自動巡航等。
幼兒園就能玩的編程機器人大盤點,玩著就能把編程學了嗎?
這些基礎的編程理念,我覺著和果果一年級做的淺奧思維題還是比較相似的,
條理性,
有序性。
孩子不難理解,但做對,或者機器路徑擺對還是不容易的。
那這些編程玩具有沒有必要玩呢?
這個就見仁見智了,一方面我個人覺著這些概念和思維孩子大了之後自然而然就理解了,即使不玩也沒什麼影響。
另一方面,果果之前玩過那種根據顏色識別路線的編程小火車(很簡單的功能,大人眼裡看簡直是沒什麼可玩的),後來看雜志時她了解到自動駕駛,
娃腦洞大開說可以在馬路上畫上不用顏色,然後車輛去識別馬路,也能實現自動駕駛!
就又感覺玩具沒白玩,既然存在就有存在的價值。
02
學齡前-小學四年級:Scratch
等孩子再大一點以及小學低年級,這時候家庭對編程的理解就比較具象了,
一般大家都默認為這時候的編程就是Scratch圖形化編程。
一直以來,我都認為Scratch是比較簡單的,通過拖拖拽拽把編程思維體現出來就好了,但在我去仔細研究時,發現難度也不小。
Scratch等級內容
一級、二級的內容,和奧數思維很像,推理,等量代換,理條理。
scratch一級、二級部分試題
而到了三級、四級,編程方面的內容就增加了很多,
比如變數、列表、函數的概念,還有在程序中加入了3種不同結構,
Scratch三、四級部分考題
但這三種程序結構,我個人感覺和路徑設計一樣,理解起來都不難的,
這些邏輯和桌游比較像,平時愛玩桌游的孩子肯定是一說就懂了。
難的是在理解基礎概念的前提下,有條理地、全面性地理清楚,這對孩子來說一直都是個不小的挑戰。
那麼小低年級的孩子有必要學習Scratch嗎?
這個問題仍然是要看個體的,就我家果果來看,目前階段,我們還是以打好數學基礎和數學思維為主。
在語文閱讀界,一直以來大家都在努力從「學習閱讀」,向「通過閱讀去學習」 過渡,
這兩年編程界,有一句類似的話是從「學習編程思維」,到「通過編程思維去思考」,
在我看來,Scratch編程思維的基礎思維,和數學思維的重疊部分還是比較多的,比如:
流程思維,
結構化思維,
可視化思維.
所以我家小低階段還是以數學思維打好基礎為主吧。
而有時間,有精力的家庭,圖形化編程和數學並不沖突,同步開啟,相輔相成,對於孩子理解結構和函數都有幫助。
03
小學四年級+:Python, C++
到了小高年級,我周圍的娃們不少已經開始學代碼編程了,比如Python,C++,
Python等級內容
C/C++等級內容
目前大家對於這兩種編程語言,普遍的一個共識是:
如果為了升學,優先選C++,因為信奧的語言就是C++,
如果是為了培養孩子興趣,拓展思維,優先選Python, 因為它比較簡單,且能實現的功能也很強大,孩子成就感會比較高。
目前很多高中開設的編程課中,基本學的都是Python。
我自己在聽Python的課時,感覺Python的基本語法還是比較好理解的,
相當於把Scratch階段可視化的邏輯用規范化的編程語言給寫出來。
像我這種門外漢,聽一耳朵課程之後,雖然寫不出來,但看代碼,基本是可以看懂的。
難的部分,在於演算法,
遞歸實例:漢諾塔
而演算法,我個人感覺是又回到了數學上。
最後咋感覺要不要學編程,又回到了要不要學數學上?
(和校內數學肯定是有區別的,可以類比為奧數)
那孩子要不要學Python或者C++呢?
相信大家心裡已經都有答案了。
Ⅱ 哪位大佬有python漢諾塔的教程
學到遞歸的時候有個漢諾塔的練習,漢諾塔應該是學習計算機遞歸演算法的經典入門案例了,所以本人覺得可以寫篇博客來表達一下自己的見解。這markdown編輯器還不怎麼會用,可能寫的有點格式有點丑啦,各位看官多多見諒.
網上找了一張漢諾塔的圖片,漢諾塔就是利用用中間的柱子把最左邊的柱子上的圓盤依次從大到小疊上去,說白了就是c要跟原來的a一樣
童鞋們理解了漢諾塔的遞歸演算法原理後,可以寫個程序來試試,這里只是學到Python的遞歸所以用了Python,童鞋們可以用其他語言實現,漢諾塔確實能幫助理解遞歸原理,遞歸在程序設計中的重要性不言而喻啦!
Ⅲ python漢諾塔非遞歸
python漢諾塔非遞歸,運用list和function知識的解答
無論stack還是recursion都是從漢諾塔的原理去解決問題,但如果已經想清楚漢諾塔的原理,其實只用把答案print出來就行了
先找規律:
一層:A-->C
兩層:A-->B
-------
A-->C
-------
B-->C
三層:A-->C
A-->B
C-->B
-------
A-->C
-------
B-->A
B-->C
A-->C
注意到n層漢諾塔有(2**n) - 1 個步驟,而中間的一步(兩個分割線之間)都是「A-->C」,中間的這一步將這一層漢諾塔的解分為上下兩個部分
仔細觀察,上面一部分是將上一層的解中所有的B,C交換,下面一部分是將上一層的解中所有的A,B交換
例如第二層是:
A-->B
A-->C
B-->C
第三層上部分就將第二層的解的C換成B,B換成C,即得出:
A-->C
A-->B
C-->B
第三層下部分就將第二層的解的A換成B,B換成A,即得出:
B-->A
A-->C
C-->B
這個規律同樣適用於第一層,和以後的所有層
然後就好辦了,代碼如圖:
代碼
其中convertAB,convertBC就是AB交換,BC交換的函數,這兩個函數可以自己定義,用中間變數即可