對于標準答案的遞歸很多人都看不懂,其實就是一個深度優先的遍歷。我寫了段偽代碼,將遞歸步驟還原并注釋了一下,供大家參考,希望大家有所收獲。
#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次打印
? ? ? ? ? ? }
? ? ? ? }? ??
? ? }
}
2019-01-25
非常感謝,終于慢慢的理解了
2019-01-20
換位置是因為每次遞歸都要重新執行算法
2018-12-07
為什么要換位置呢?請問換位置的邏輯在哪里?
2018-12-02
補充說明一下,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).