亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

對于標準答案的遞歸很多人都看不懂,其實就是一個深度優先的遍歷。我寫了段偽代碼,將遞歸步驟還原并注釋了一下,供大家參考,希望大家有所收獲。

#if條件不成立的省略

# { 看做遞歸開始

# } 看做遞歸結束

move(4, a, b, c):{? #實際數值(4, A, B, C)

? ? move(3, a, c, b):{? ? ? ? ? ? #c,b調換,實際數值(3, A, C, B), 將這四個值帶入move(3, a, b, c)遞歸1

? ? ? ? move(2, a, c, b):{? ? ? ? #c,b調換,實際數值(2, A, B, C), 將這四個值帶入move(2, a, b, c)遞歸2

? ? ? ? ? ? move(1, a, c, b):{? ? #c,b調換,實際數值(1, A, C, B), 將這四個值帶入move(1, a, b, c)遞歸3

? ? ? ? ? ? ? ? if n == 1:? ? ? ? #此時n==1,if條件成立

? ? ? ? ? ? ? ? print(a, '-->',c) #這是第一次打印A-->B

? ? ? ? ? ? }? ? ? ? ? ? ? ? ? ? ?#最近的一次遞歸3完成,回到遞歸2,實際數值(2, A, B, C)

? ? ? ? ? ? print(a, '-->', c)? ? #這是第二次打印A-->C

? ? ? ? ? ? move(1, b, a, c):{? ? #a,b調換,實際數值(1, B, A, C), 將這四個值帶入move(1, a, b, c)遞歸4

? ? ? ? ? ? ? ? if n == 1:

? ? ? ? ? ? ? ? print(a, '-->', c)#這是第三次打印B-->C? ? ? ??

? ? ? ? ? ? }? ? ? ? ? ? ? ? ? ? ?#最近的一次遞歸4完成,回到遞歸2,實際數值(2, A, B, C)

? ? ? ? }? ? ? ? ? ? ? ? ? ? ? ? ?#最近的一次遞歸2完成,回到遞歸1,實際數值(3, A, C, B)? ? ? ? ? ??

? ? ? ? print(a, '-->', c)? ? ? ? #這是第四次打印A-->B

? ? ? ? move(2, b, a, c):{? ? ? ? #a,b調換, 實際數值(2, C, A, B), 將這四個值帶入move(2, a, b, c)遞歸5

? ? ? ? ? ? move(1, a, c, b):{? ? #c,b調換, 實際數值(1, C, B, A), 將這四個值帶入move(1, a, b, c)遞歸6

? ? ? ? ? ? ? ? if n == 1:

? ? ? ? ? ? ? ? print(a, '-->', c)#這是第五次打印C-->A

? ? ? ? ? ? }? ? ? ? ? ? ? ? ? ? ?#最近的一次遞歸6完成,回到遞歸5,實際數值(2, C, A, B)

? ? ? ? ? ? print(a, '-->', c)? ? #這是第六次打印C-->B

? ? ? ? ? ? move(1, b, a, c):{? ? #a,b調換, 實際數值(1, A, C, B), 將這四個值帶入move(1, a, b, c)遞歸7

? ? ? ? ? ? ? ? if n == 1:

? ? ? ? ? ? ? ? print(a, '-->', c)#這是第七次打印A-->B

? ? ? ? ? ? }? ? ? ? ? ? ? ? ? ? ?#最近的一次遞歸7完成,回到遞歸5,實際數值(2, C, A, B)

? ? ? ? }? ? ? ? ? ? ? ? ? ? ? ? ?#最近的一次遞歸5完成,回到遞歸1,實際數值(3, A, C, B)

? ? }? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#最近的一次遞歸1完成,原參數中的move(n - 1, a, c, b)遞歸全部完成,實際數值(4, A, B, C)

? ? print(a, '-->', c)? #這是第八次打印A-->C,下面跟上面同樣的方式去理解,就不寫了,太累了。

? ? move(3, b, a, c):{

? ? ? ? move(2, a, c, b):{

? ? ? ? ? ? move(1, a, c, b):{

? ? ? ? ? ? ? ? if n == 1:

? ? ? ? ? ? ? ? print(a, '-->', c)? ?#這是第九次打印

? ? ? ? ? ? }

? ? ? ? ? ? print(a, '-->', c)#這是第10次打印

? ? ? ? ? ? move(1, b, a, c):{

? ? ? ? ? ? ? ? if n == 1:

? ? ? ? ? ? ? ? print(a, '-->', c)#這是第11次打印

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? print(a, '-->', c)? ?#這是第12次打印

? ? ? ? move(2, b, a, c):{

? ? ? ? ? ? move(1, a, c, b):{

? ? ? ? ? ? ? ? if n == 1:

? ? ? ? ? ? ? ? print(a, '-->', c)? ?#這是第13次打印

? ? ? ? ? ? }

? ? ? ? ? ? print(a, '-->', c)#這是第14次打印

? ? ? ? ? ? move(1, b, a, c):{

? ? ? ? ? ? ? ? if n == 1:

? ? ? ? ? ? ? ? print(a, '-->', c)#這是第15次打印

? ? ? ? ? ? }

? ? ? ? }? ??

? ? }

}


正在回答

4 回答

非常感謝,終于慢慢的理解了

0 回復 有任何疑惑可以回復我~

換位置是因為每次遞歸都要重新執行算法

0 回復 有任何疑惑可以回復我~
#1

qq_必然_1

這是對c,b所代表的值如何進行替換的解釋,c,b的位置替換的原因是在搬動盤子的過程中,先將盤子從a搬到c,還有從b搬到c
2019-01-20 回復 有任何疑惑可以回復我~

為什么要換位置呢?請問換位置的邏輯在哪里?

0 回復 有任何疑惑可以回復我~

補充說明一下,move(n a, b, c)里的參數變動,其實是實際參數的(4, A, B, C)的位置變動。move(n-1, a, c, b)就是講實際參數的4減了1,B與C的位置換了,變成(3,A, C,B )。move(n-1, a, c, b)是一次性的。等下次開始算的時候就又成move(n a, b, c)。舉個例子3人就是排隊報數為(1,2,3,),1號和3號換位置寫法(3,2,1,),換完后位置后報數還是(1,2,3,),并不是(3,2,1).

6 回復 有任何疑惑可以回復我~
#1

慕九州2485307

為什么要換位置呢?請問換位置的邏輯在哪里?
2018-12-07 回復 有任何疑惑可以回復我~
#2

Mr_黃黃 回復 慕九州2485307

你想明白這個,你需要明白漢諾塔的規則,我最初不懂什么是漢諾塔,疑惑了很久
2019-01-25 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消
初識Python
  • 參與學習       758392    人
  • 解答問題       8967    個

學python入門視頻教程,讓你快速入門并能編寫簡單的Python程序

進入課程

對于標準答案的遞歸很多人都看不懂,其實就是一個深度優先的遍歷。我寫了段偽代碼,將遞歸步驟還原并注釋了一下,供大家參考,希望大家有所收獲。

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號