1. 程式人生 > >Python學習筆記__2.4章 遞歸函數

Python學習筆記__2.4章 遞歸函數

編程語言 Python

# 這是學習廖雪峰老師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章 遞歸函數