Python學習筆記 2 4章 遞迴函式

2021-08-28 08:19:00 字數 1635 閱讀 8451

# 這是學習廖雪峰老師python教程的學習筆記

在函式內部,可以呼叫其他函式。

如果乙個函式在內部呼叫自身本身,這個函式就是遞迴函式。

使用遞迴函式寫乙個階乘函式:

def fact(n):

if n==1:

return 1

return n * fact(n - 1)

計算過程:

===> fact(5)

===> 5 * fact(4)

===> 5 * (4 * fact(3))

===> 5 * (4 * (3 * fact(2)))

===> 5 * (4 * (3 * (2 * fact(1))))

===> 5 * (4 * (3 * (2 * 1)))

===> 5 * (4 * (3 * 2))

===> 5 * (4 * 6)

===> 5 * 24

===> 120

例題漢諾塔的移動可以用遞迴函式非常簡單地實現。

請編寫move(n, a, b, c)函式,它接收引數n,表示3個柱子a、b、c中第1個柱子a的盤子數量,然後列印出把所有盤子從a借助b移動到c的方法,例如:

# -*- coding: utf-8 -*-

def move(n, a, b, c):

if n==1:

print('move',a,'-->',c) #圓盤個數為1時,從a移動到c即可完成,用來終止遞迴

else:

move(n-1,a,c,b)  #把除了a柱子最下的乙個圓盤以外的其他圓盤,都移動到b柱子

move(1,a,b,c)    #把a柱子最下的圓盤,移動到c柱子

move(n-1,b,a,c)  #把b柱子上的n-1個盤子,全部移動到c柱子

解析:n==1 時,print 的是 a的值 ——》 c的值

首先區分 位置 和 值的關係。 這個函式在不斷的調換各 位置 對應的 值,理解a,b,c

和其對應位置的關係

那麼,當n=3時,以大寫字母表示位置,小寫字母表示 真正的值

move(3,a,b,c)此時【a】=【a】,【b】=【b】,【c】=【c】

然後:

move(2,a,c,b)  # 將b,c的值調換了,此時【a】=【a】,【b】=【c】,【c】=【b】

move(1,a,c,b)  # 又將 b,c的值調換回來了 a-》c,此時【a】=【a】,【b】=【b】,【c】=【c】

move(1,a,b,c) # 此時【a】=【a】,【b】=【c】,【c】=【b】。故 a—》b

move(1,b,a,c) # 此時【a】=【c】,【b】=【a】,【c】=【b】。故 c—》b

move(1,a,b,c) # 此時【a】=【a】,【b】=【b】,【c】=【c】。故 a—》c

move(2,b,a,c) #  此時【a】=【b】,【b】=【a】,【c】=【c】。故 c—》b

move(1,a,c,b) # 此時【a】=【b】,【b】=【c】,【c】=【a】。故 b—》a

move(1,a,b,c) # 此時【a】=【b】,【b】=【a】,【c】=【c】。故 b—》c

move(1,b,a,c) # 此時【a】=【a】,【b】=【b】,【c】=【b】。故 a—》c

python學習筆記一 遞迴

漢諾塔 def hannoi n,x,y,z if n 1 print x,z else hannoi n 1,x,z,y 將n 1個盤子從x移動到y print x,z 將x中最後乙個盤子移動到z hannoi n 1,y,x,z 將n 1個盤子從y移動到z n int input 請輸入漢諾塔層...

Python學習筆記 2 4 list迴圈

首先舉個例子 l 1,1,1,2,3,4,5 for i in l if i 2 0 把list中的奇數刪除 l.remove i print l 但是執行結果是 1,2,4 有奇數沒被刪掉。所以可以看出,迴圈刪list的時候會導致下標錯位,結果是不對的。原因 l 1,1,1,2,3,4,5 0 1...

算24 遞迴 演算法學習

問題 給出4個小於10個正整數,你可以使用加減乘除4種運算以及括 號把這4個數連線起來得到乙個表示式。現在的問題是,是否存 在一種方式使得得到的表示式的結果等於24。這裡加減乘除以及括號的運算結果和運算的優先順序跟我們平常 的定義一致 這裡的除法定義是實數除法 比如,對於5,5,5,1,我們知道5 ...