遞迴式方法可以被用於解決很多的電腦科學問題,因此它是電腦科學中十分重要的乙個概念。絕大多數程式語言支援函式的自呼叫,在這些語言中函式可以通過呼叫自身來進行遞迴。
計算理論可以證明遞迴的作用可以完全取代迴圈,因此在很多函式程式語言(如scheme)中習慣用遞迴來實現迴圈。
遞迴的強大之處在於它允許使用者用有限的語句描述無限的物件。
因此,在電腦科學中,遞迴可以被用來描述無限步的運算,儘管描述運算的程式是有限的。
下面是對python遞迴函式的簡單了解:
#類似與棧的先進後出模式
#遞迴的兩個必要條件
#1.要有遞推關係
#2.要有臨界
defdigui(num):
print('
$'+str(num))
#臨界值
if num >0:
#這裡用的是呼叫本身的函式(遞推關係)
digui(num-1)
else
:
print('
='*20)
(num)
digui(3)
輸出結果為:
$3什麼是漢諾塔?$2$1
$0********************01
23
其實演算法非常簡單,當盤子的個數為n時,移動的次數應等於2^n – 1(有興趣的可以自己證明試試看)。後來一位美國學者發現一種出人意料的簡單方法,只要輪流進行兩步操作就可以了。首先把三根柱子按順序排成品字型,把所有的圓盤按從大到小的順序放在柱子a上,根據圓盤的數量確定柱子的排放順序:若n為偶數,按順時針方向依次擺放 a b c;
若n為奇數,按順時針方向依次擺放 a c b。
⑴按順時針方向把圓盤1從現在的柱子移動到下一根柱子,即當n為偶數時,若圓盤1在柱子a,則把它移動到b;若圓盤1在柱子b,則把它移動到c;若圓盤1在柱子c,則把它移動到a。
⑵接著,把另外兩根柱子上可以移動的圓盤移動到新的柱子上。即把非空柱子上的圓盤移動到空柱子上,當兩根柱子都非空時,移動較小的圓盤。這一步沒有明確規定移動哪個圓盤,你可能以為會有多種可能性,其實不然,可實施的行動是唯一的。
⑶反覆進行⑴⑵操作,最後就能按規定完成漢諾塔的移動。
所以結果非常簡單,就是按照移動規則向乙個方向移動金片:
如3階漢諾塔的移動:a→c,a→b,c→b,a→c,b→a,b→c,a→c
#輸出結果為:----------------漢諾塔-----------------#
#如果有n個圓盤,所需移動的步數為 2^n-1
i =0
#定義乙個函式給4個引數n是圓盤的個數,a代表a柱子,b,c 函式裡面的是形式引數
defmove(n,a,b,c):
#把變數i全域性化,如果不全域性化,只可訪問讀取不能進行操作修改
global
i
if n==1:
i += 1
print('
移動第',i,'
次',a,'
-->
',c)
else
:
#1.把a柱上n-1個圓盤移動到b柱上
move(n-1,a,c,b) #
傳的才是實際引數
#2.把a柱上最大的移動到c柱子上
move(1,a,b,c)
#3.把b柱子上n-1個圓盤移動到c柱子上
move(n-1,b,a,c)
move(4,'
a','
b','
c')
移動第 1 次 a --> b移動第 2 次 a --> c
移動第 3 次 b --> c
移動第 4 次 a --> b
移動第 5 次 c --> a
移動第 6 次 c --> b
移動第 7 次 a --> b
移動第 8 次 a --> c
移動第 9 次 b --> c
移動第 10 次 b --> a
移動第 11 次 c --> a
移動第 12 次 b --> c
移動第 13 次 a --> b
移動第 14 次 a --> c
移動第 15 次 b --> c
漢諾塔 遞迴 詳解
include uncle lu includeusing namespace std 漢諾塔問題是將問題化簡為更簡單的問題。當你需要從a到c挪n n 2 個的時候,你應該先把上面n 1個挪到b上,然後再把第n個挪到c上,再把b上的n 1個挪回c 可以發現這是有邊界的,當n 1時直接移動就可以了。所...
漢諾塔遞迴 Python
今天繼續學習遞迴 終於 終於把 去年學c語言沒看懂也沒去研究的漢諾塔解決了 感謝網上眾多的老鐵們的資料相助 和 宿舍學長的幫助,好了以下說理解後的思路 1 n 1 第1次 1號盤 a csum 1 次 2 n 2 第1次 1號盤 a b 第2次 2號盤 a c 第3次 1號盤 b c sum 3 次...
漢諾塔問題詳解 遞迴
題意 漢諾塔 漢諾塔 又稱河內塔 問題是源於印度乙個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上安大小順序摞著64片 圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動乙個圓盤。理論...