漢諾塔

題目:

漢諾塔的移動可以用遞歸函數(shù)非常簡單地實現(xiàn)。

請編寫move(n, a, b, c)函數(shù),它接收參數(shù)n,表示3個柱子A、B、C中第1個柱子A的盤子數(shù)量,然后打印出把所有盤子從A借助B移動到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): #定義一個move函數(shù),有n,a,b,c四個函數(shù),n代表第一個架子上有幾個圓盤,a,b,c是按順序的三個架子的名字。

if n ==1:

print(a,'→>',c)

return? #當圓盤個數(shù)為1時,把圓盤從a移到c即可完成。是用來終止遞歸的。

move(n-1,a,c,b)? # 把除了a架子最下的一個圓盤外的圓盤,移動到b盤

move(1,a,b,c) #把a架子最下一個圓盤,移動到c盤

move(n-1,b,a,c) #把b架子最下一個圓盤外的圓盤移動到c。

#循環(huán),直到a上所有移動到c上。

move(3,'a','b','c')

疑問1:

為何定義函數(shù)的時候,a,b,c是int嗎,調(diào)用的時候,傳的值是'a','b','c'(字符串)?

疑問2:

a,b,c三個架子的順序是如何?如第一句:move(n-1,a,c,b)意思是把n-1這些盤子從a移到c再移到b?

疑問3:

循環(huán)是哪個語句實現(xiàn)的?不是很明白這些語句執(zhí)行的順序。

疑問4:

只有一句print(a,'→>',c)是用來輸出,用來終止遞歸的,為何運行結果會有那么多輸出?


疑問解答(感謝@雅尓達x_x

1、我們定義函數(shù)的時候,def move(n,a,b,c) 中a,b,c所表達的意義是代指這里有三個柱子:起始柱,中間柱,終點柱。而傳值的時候,給的'a','b','c',在于具體給這個函數(shù)指明了起始柱是a,中間柱是b,終點柱是c,即我們要把圓盤從a柱子移動到c柱子中間借助b柱子。?

2、a,b,c上個柱子的順序就是從左到右a,b,c。第一句的意思參考上條解釋:是把n-1個柱子從a借助c移動到b。

3、循環(huán)是通過函數(shù)的遞歸實現(xiàn)的。所有的遞歸都是一種循環(huán)。執(zhí)行順序的話按照函數(shù)定義的順序從上往下執(zhí)行。

上面中的每個move操作都是個新函數(shù),都會遞歸到函數(shù)到里面,直到執(zhí)行到n=1,再return一步步跳出來。執(zhí)行完第一個move,再執(zhí)行第二個move,再執(zhí)行第三個move.

4.你理解了3的話,4也就理解了。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容