Python學習筆記__2.4章 遞歸函數
# 這是學習廖雪峰老師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學習筆記__2.4章 遞歸函數