python學習 遞迴(階乘 漢諾塔)

2021-10-06 14:41:35 字數 2717 閱讀 9848

如果需要求乙個數的階乘,可能剛開始腦海裡面冒出來的是迴圈計算,下面看看迴圈如何實現:

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 ...