# 這是學習廖雪峰老師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 ...