如果需要求乙個數的階乘,可能剛開始腦海裡面冒出來的是迴圈計算,下面看看迴圈如何實現:
def
recur1
(num)
: rst1 =
1for item in
range(1
, num +1)
:print
(item)
rst1 = rst1 * item
print
(rst1)
return rst1
recur1(
5)
為了體現變化,我這裡把每個值都列印出來了。
執行結果:
1 * 2 * 3 * 4 * 5 = 120
def
recur2
(num)
:if num ==1:
return num
return num * recur2(num -1)
print
(recur2(5)
)
執行結果:120
在示例中我們能看到,**比使用迴圈簡潔了不少,而且意義更明了。
下面這段話也要注意:
基線條件(base case)。基線條件是遞迴程式的最底層位置,在此位置時沒有必要再進行操作,可以直接返回乙個結果。
所有遞迴程式都必須至少擁有乙個基線條件,而且必須確保它們最終會達到某個基線條件;否則,程式將永遠執行下去,直到程式缺少記憶體或者棧空間。
推薦另一篇關於遞迴的文章,寫得很詳細,也很用心,如果我的博文有幸被你們看到,那可以去看看他的這篇:python遞迴演算法詳解
寫得很詳細的,內容更豐富。
預設的python有乙個可用的遞迴深度的限制,以避免耗盡計算機中的記憶體。預設是1000。
當然遞迴的優點和缺點都是很明顯的,從剛才推薦的這篇博文裡面截了一張圖,大家可以看看。
有一座鑽石寶塔a,其上有64個金蝶。所有碟子按從大到小的次序從塔底堆放至塔頂。緊挨著這座塔有另外兩個鑽石寶塔b和c。每次只能移動乙個碟子,任何時候都不能把乙個碟子放在比它小的碟子上面。把a上的碟子全部移到c上。
這個如果不用遞迴,實現起來,難度太大,畢竟次數太多了。
使用遞迴看著就會很簡單了,上**:
使用遞迴解決問題,首先需要化繁為簡,簡化步驟,明確要實現的功能。
def
hanoi
(n, a, b, c):if
(n ==1)
: move(a, c)
#表示只有乙個碟子時,直接從a塔移動到c塔
else
: hanoi(n -
1, a, c, b)
#將剩下的a塔上的n-1借助c塔移動到b塔
move(a, c)
#將a上最後乙個直接移動到c塔上
hanoi(n -
1, b, a, c)
#將b塔上的n-1個碟子借助a塔移動到c塔
這段**就是對漢諾塔使用遞迴實現的一種解析,綜合起來分成三步。
實現**:
ibeg =
1def
move
(inum, frm, to)
:global ibeg
# print("第%d步:將%d號盤子從%s -> %s" % (ibeg, inum, frm, to))
ibeg +=
1def
hanoi
(inum, a, b, c)
:if inum ==1:
move(
1, a, c)
else
: hanoi(inum -
1, a, c, b)
move(inum, a, c)
hanoi(inum -
1, b, a, c)
inum =
int(
input
("請輸入乙個數字:"))
ifisinstance
(inum,
int):if
0> inum or inum >64:
print
("請輸入乙個0-64之間的整數!"
)else
: hanoi(inum,
'a',
'b',
'c')
print
("移動步數:"
, ibeg)
else
:print
("請輸入乙個整數!"
)
大家可以自己執行試試,move函式裡面有個注釋,如果執行數字比較小,10以內,那就可以放開注釋,看看執行步驟。如果數字較大,還是直接執行吧。
如果大家電腦效能不太好,那還是不要嘗試64個盤子的漢諾塔了,太耗時
本來想測試一下64個盤子要迴圈多少次,不過跑了乙個小時還沒跑出來。10,20都能很快跑出結果,30跑了幾分鐘,執行出結果了:
下面這張圖是比較直觀的一種方式,在ppt裡面,插入這幾個形狀,然後自己挪動一下,從a按步驟,挪動到c,對這個思路就比較的清晰了。
還有乙個斐波拉契數列,這個遞迴實現網上很多,我這裡沒有去自己實現,所以不貼**了。
漢諾塔遞迴 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 次...
遞迴階乘,遞迴求和,兔子數列,漢諾塔
include int ride int n 當n 1的時候結束。else if n 1 else int sum int n else if n 1 else int tuzi int n else 列印兔子數列的每乙個。void tuzip int n 漢諾塔 有三根柱子,分為左 中 右,然後左...
python 漢諾塔 Python漢諾塔
import turtle class stack def init self self.items def isempty self return len self.items 0 def push self,item def pop self return self.items.pop def ...