關於遞歸理解與python實現
最近在看小甲魚的視頻學python,雖然小甲魚時時有驚人之語,但講的還不錯,關於遞歸他講了階乘,斐波那契和漢諾塔三個例子,難度是遞增的
遞歸我在學C語言的時候也了解過,但是還是有點懵懂,這幾天學python函數學到遞歸,感覺有收獲,於是寫個博客記錄一下
先說說遞歸:遞歸就是函數調用自身,有兩個過程,一個是“遞”,一個是“歸”
首先是階乘
階乘的數學表達式是這樣,比如n的階乘 n!=n*(n-1)*(n-2)*....2*1
def factorial(n) ‘階乘遞歸‘ if n == 1:return 1 else: return n * factorial(n - 1)
階乘遞歸可以這樣理解
f(n)=1 (n=1)
f(n)=n*f(n-1) (n>1)
然後是斐波那契數列
1,1,2,3,4,5....
斐波那契數列的特點是第一個和第二個數是1,後面的數都是其前面兩個數的和
def fibonacci(m): ‘斐波那契遞歸‘ if m == 2 | m == 1: return 1 else: return fibonacci(m - 1) + fibonacci(m - 2)
斐波那契數列也可以用數學函數幫助理解
f(n)=1 n=1,2
f(n)=f(n-1)+f(n-2) n>2
最後是漢諾塔
漢諾塔問題是源於印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤
我們要實現的是將移動圓盤的順序一個一個打印出來
def hanoi(n, x, y, z): ‘漢諾塔移動路徑‘ ifn == 1: print(x, "-->", z) else: hanoi(n - 1, x, z, y) # 將上面n-1個盤子從x移動到y print(x, "-->", z) # 將最下面的盤子從x移動到z上 hanoi(n - 1, y, x, z) # 將y上面的n-1個盤子移動到z
n是圓盤數量,x,y,z分別代表三根圓柱
先整體分析hanoi(n,x,y,z)這個表示把第一根柱子,也就是第一根圓柱x上面的n個圓盤移動到 第三根z,如果函數是hanoi(n,1,2,3),就是把1上面的圓盤移動到3上面
hanoi()函數功能圖示
def hanoi(n, x, y, z): ‘漢諾塔移動路徑‘ if n == 1: print(x, "-->", z) else: hanoi(n - 1, x, z, y) # 將上面n-1個盤子從x移動到y print(x, "-->", z) # 將最下面的盤子從x移動到z上 hanoi(n - 1, y, x, z) # 將y上面的n-1個盤子移動到z m = int(input()) hanoi(m, ‘x‘, ‘y‘, ‘z‘)
輸入3
x --> z
x --> y
z --> y
x --> z
y --> x
y --> z
x --> z
得到移動過程,沒問題
局部分析:
if n == 1:
print(x, "-->", z)
這個就表示只有一個圓盤時,直接把x上面的圓盤移動到z上
hanoi(n - 1, x, z, y) # 將上面n-1個盤子從x移動到y
這裏就是關鍵了,先想想hanoi()函數作用,那這個函數就是把x的上面n-1個圓盤移動到y上,好了,前n-1個圓盤移動到y上
print(x, "-->", z) # 將最下面的盤子從x移動到z上
這裏表示的其實是將第一根圓柱最上面的圓盤移動到第三根圓柱,此時第一根圓柱只有一個圓盤,因為上面的n-1個已經在上一步移動到了第二根圓柱y
hanoi(n - 1, y, x, z) # 將y上面的n-1個盤子移動到z
前面我們把n-1個圓盤移動到了y,然後把那最後一個圓盤移動到z,現在是最後一步,把y上面的n-1個圓盤移動到z
分析結束
就這麽三步,解決漢諾塔
也許你還有疑問,既然可以移動n-1個圓盤,為什麽不直接把n個圓盤移動到z上面,那你想想,hanoi(n,x,y,z)意思不就是把n個圓盤從x移動到z,有趣的遞歸
在未完成時,假設函數可以實現功能,先調用
遞歸就是調用自身
關於遞歸理解與python實現