關于題目中的闡釋
①中間這段話本身我不能理解,當n>=3時,明顯需要借助a進行多次操作(如)才能完成,為什么用(N-1)就能使操作變成簡單的A到B,A到C,然后B到C就結束了?(當N=3時,實際操作需要7步,但編程只用了這3步表達)這樣看起來似乎只需要3個步驟???這個該怎么理解呢?我始終理解不了,是對遞歸函數的定義不清晰嗎?
②:拋開第一個問題,我翻了答案,def move(n,a,b,c),if n==0,輸出a到c然后return,這個我理解,接下來就是move(n-1,a,c,b),這一句里面b,c換位置是為何?我也百度許多,就是看不懂啊,因為沒人具體解釋這里,不太能理解,然后這一句后面是一句輸出接著又是一句move(n-1,b,a,c)又是換位置的,我看不太懂
2017-02-14
這個問題其實很簡單,就假設只有2塊,要從第一個柱子移動到第三個柱子,但移動時均要借助第二個柱子轉移一下。這樣就是說,不管從哪個柱子到目標柱子,都要借助另外那個柱子中轉一下。
假設兩塊叫(x,y),柱子叫(①②③),移動x 柱子順序是①②③,移動y時柱子順序先是①③②,最后移動y的順序是②①③,只不過這里y用n-1代替了而已,遞歸一下就ok了,語句不代表就需要三步,而是重復同樣的步驟而已
2017-02-18
2017-02-15
接之前那個'to'和'-->'的問題,
我嘗試理解當n=2時,
代碼跳過if執行move(n-1,a,c,b)的時候,這個時候其實就是move(1,a,c,b)了,有筆記說這個就已經滿足if條件,因此執行if,輸出if里的a to c,但是答案是a to b,也就是說,這個時候,tuple[3]已經是b了,但接下來的一句print a-->c應該就代表答案里的第二句a-->c吧?怎么答案里的c又變回c了?我感覺在進行print a-->c的時候,之前一句的move(n-1,a,c,b)……寫到這里時我就不知道自己在說什么想什么了,好糊涂,
? ? ? ? ? ? ? ?換個說法吧,move(n-1,a,c,b)這一句代碼執行之后的結果,對應實際情況就是a(第n個),b(n-1個),c(0個)
然后其下的print a-->c,這一句代碼執行之后,實際情況似乎變成了a(0個),b(n-1個),c(第n個)
那么,這一句print輸出語句是怎么完成一次改變實際情況的?他只是一個輸出語句,什么命令都沒有執行吧?還是說我理解錯誤了?
我在上面的有個回答里發現,這一步print所應該造成的表現,其實際操作過程似乎被歸納到第三句move(n-1,b,a,c)中了,根據我現在迷糊的情況,我認為這個看法可能是錯誤的……
我的問題就在第二句print a-->c,代碼是如何實現根據這一步得到答案a-->c的,畢竟在前一句已經改變了tuple[3]為b了
哎,好混亂
2017-02-15
請原諒我又有問題,麻煩大家幫我看一下,解決一下
我稍微改了下標準答案(就是將其中一個print的'-->'換成了‘to’)
def move(n,a,b,c):
? ? if n==1:
? ? ? ? print a,'to',c
? ? ? ? return
? ? move(n-1,a,c,b)
? ? print a,'-->',c
? ? move(n-1,b,a,c)
這樣做的原因,當n=2時,得到答案:
a to b
a --> c
b to c
可以看出來,答案第一句a to b 是代碼執行if里面的print a to c而非move(n-1,a,c,b)下面的print a-->c。
那么問題是,當n=2時,if條件不滿足,就會跳過if執行move(n-1,a,c,b),這一步就是思路的第一步:把n-1個盤從a移到c,接著print a-->c,那么為什么答案的第一句是a to c呢?
這個執行順序到底是怎么回事?還是我對代碼的理解有誤?
2017-02-15
恩!經過反復思考,我發現后面的move(n-1,b,a,c)其實代表的是兩步,第一步就是前一句printa到c(這一步在代碼中只是輸出,并沒有進行操作,應該是并入后面這個move里了),就是執行這一步里的把第n個盤子,從a移到c,然后第二步,把(【上上句move(n-1,a,c,b)里從a移到b的】(n-1)個盤子再從b移到c,這一句其實代表了兩個步驟,因此我看不懂,
不過現在還是有些不懂:
n-1個盤子從a到b,原句從move(n,a,b,c)到move(n-1,a,c,b),n變成n-1,說明只移動n-1個,那么b和c的位置互換了,是怎么回事呢?不是把n-1個盤從a到b嗎?跟c應該沒關系?。?/p>
2017-02-14