題目:
漢諾塔的移動(dòng)可以用遞歸函數(shù)非常簡(jiǎn)單地實(shí)現(xiàn)。
請(qǐng)編寫move(n, a, b, c)函數(shù),它接收參數(shù)n,表示3個(gè)柱子A、B、C中第1個(gè)柱子A的盤子數(shù)量,然后打印出把所有盤子從A借助B移動(dòng)到C的方法,例如:
def move(n, a, b, c):
# 期待輸出:
# A --> C
# A --> B
# C --> B
# A --> C
# B --> A
# B --> C
# A --> C
move(3, 'A', 'B', 'C')
答案:
def move(n, a, b, c):
if n == 1:
print(a,'->',c)
return
else:
move(n-1, a, c, b)
move(1, a, b, c)
move(n-1, b, a, c)
move(3, 'a', 'b', 'c')
疑問:
def move(n,a,b,c): #定義一個(gè)move函數(shù),有n,a,b,c四個(gè)函數(shù),n代表第一個(gè)架子上有幾個(gè)圓盤,a,b,c是按順序的三個(gè)架子的名字。
if n ==1:
print(a,'→>',c)
return? #當(dāng)圓盤個(gè)數(shù)為1時(shí),把圓盤從a移到c即可完成。是用來終止遞歸的。
move(n-1,a,c,b)? # 把除了a架子最下的一個(gè)圓盤外的圓盤,移動(dòng)到b盤
move(1,a,b,c) #把a(bǔ)架子最下一個(gè)圓盤,移動(dòng)到c盤
move(n-1,b,a,c) #把b架子最下一個(gè)圓盤外的圓盤移動(dòng)到c。
#循環(huán),直到a上所有移動(dòng)到c上。
move(3,'a','b','c')
疑問1:
為何定義函數(shù)的時(shí)候,a,b,c是int嗎,調(diào)用的時(shí)候,傳的值是'a','b','c'(字符串)?
疑問2:
a,b,c三個(gè)架子的順序是如何?如第一句:move(n-1,a,c,b)意思是把n-1這些盤子從a移到c再移到b?
疑問3:
循環(huán)是哪個(gè)語(yǔ)句實(shí)現(xiàn)的?不是很明白這些語(yǔ)句執(zhí)行的順序。
疑問4:
只有一句print(a,'→>',c)是用來輸出,用來終止遞歸的,為何運(yùn)行結(jié)果會(huì)有那么多輸出?
疑問解答(感謝@雅尓達(dá)x_x)
1、我們定義函數(shù)的時(shí)候,def move(n,a,b,c) 中a,b,c所表達(dá)的意義是代指這里有三個(gè)柱子:起始柱,中間柱,終點(diǎn)柱。而傳值的時(shí)候,給的'a','b','c',在于具體給這個(gè)函數(shù)指明了起始柱是a,中間柱是b,終點(diǎn)柱是c,即我們要把圓盤從a柱子移動(dòng)到c柱子中間借助b柱子。?
2、a,b,c上個(gè)柱子的順序就是從左到右a,b,c。第一句的意思參考上條解釋:是把n-1個(gè)柱子從a借助c移動(dòng)到b。
3、循環(huán)是通過函數(shù)的遞歸實(shí)現(xiàn)的。所有的遞歸都是一種循環(huán)。執(zhí)行順序的話按照函數(shù)定義的順序從上往下執(zhí)行。
上面中的每個(gè)move操作都是個(gè)新函數(shù),都會(huì)遞歸到函數(shù)到里面,直到執(zhí)行到n=1,再return一步步跳出來。執(zhí)行完第一個(gè)move,再執(zhí)行第二個(gè)move,再執(zhí)行第三個(gè)move.
4.你理解了3的話,4也就理解了。