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

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

關于題目中的闡釋

①中間這段話本身我不能理解,當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)又是換位置的,我看不太懂


正在回答

6 回答

這個問題其實很簡單,就假設只有2塊,要從第一個柱子移動到第三個柱子,但移動時均要借助第二個柱子轉移一下。這樣就是說,不管從哪個柱子到目標柱子,都要借助另外那個柱子中轉一下。

假設兩塊叫(x,y),柱子叫(①②③),移動x 柱子順序是①②③,移動y時柱子順序先是①③②,最后移動y的順序是②①③,只不過這里y用n-1代替了而已,遞歸一下就ok了,語句不代表就需要三步,而是重復同樣的步驟而已

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

qq_玩嵐子_0 提問者

不勝感激!我就是搞不懂盤子的移動和move中元素的改變有什么聯系,為什么這樣改變,現在大概懂了,如果你還有時間,請你看這個問題下面我的回答,看看我的理解正不正確,謝謝!
2017-02-15 回復 有任何疑惑可以回復我~
#2

qq_玩嵐子_0 提問者

非常感謝!
2017-02-16 回復 有任何疑惑可以回復我~
#漢諾塔
def?move(n,?a,?b,?c):
???if?n?==1:
???????print(a,?'to',?c)
???????return
???move(n-1,?a,?c,?b)#move(1,a,c,b)然后先運算這個move,此時n=2-1=1,即,move(1,'A','C','B'),則print(a,'to',c),此時這個move已經運算結束了,可以開始下一行的運算
???print(a,?'-->',?c)#上面一行等于語句print(a,'to',c),所以這一行照常print
???move(n-1,?b,?a,?c)#此時,依然是n=2-1=1,則運算這個move,即,move(1,'B','A','C'),同上,當n=1時,print(a,'to',c)
move(2,?'A',?'B',?'C')
0 回復 有任何疑惑可以回復我~
#1

qq_玩嵐子_0 提問者

非常感謝你,我就是不太懂這個代碼的執行順序,但是還有一個小問題,print(a,'-->',c)#上一句等同print(a ,'to',c),所以這一行照常print, 上一行就是move(n-1,a,c,b)這一句,這個時候tuple[1,3]分別為'A','B'了,接下來的print(a,'-->',c)不應該輸出A-->B嗎?難道說這一句print因為沒有在上一句move的縮進之下(或者說同級,不知道我這個理解對不對),所以這一句print針對的是move(n,a,b,c)?
2017-02-20 回復 有任何疑惑可以回復我~
#2

Mr扶風人3851981 回復 qq_玩嵐子_0 提問者

我自己感覺,你可以把 print(a, '--> ',c)看成 move(1,a,b,c),上面已經將n-1個盤子移到B上,下面就把A上剩的最后一個盤子移到C上,我自己是這么理解的,不知道對不對。
2017-02-21 回復 有任何疑惑可以回復我~
#3

他is 回復 qq_玩嵐子_0 提問者

只需要把上一行的move(n-1,a,c,b)看做是一個print()語句就可以了。這個move()本身就是一個運算循環,自己運算結束,不影響下一行的print,因為這個print是針對def move()這個函數的。
2017-02-21 回復 有任何疑惑可以回復我~

接之前那個'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了

哎,好混亂

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

請原諒我又有問題,麻煩大家幫我看一下,解決一下
我稍微改了下標準答案(就是將其中一個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呢?

這個執行順序到底是怎么回事?還是我對代碼的理解有誤?

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

恩!經過反復思考,我發現后面的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>

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

qq_玩嵐子_0 提問者

哎!看了筆記列表中“憂郁的兔八哥”同學的筆記,我瞬間恍然大悟! 原來move(n,a,b,c)這句的意思就是把n個東西,從a借助b,移動到c上去 所以第一句中move(n-1,a,c,b)的意思就是把n-1個東西,從a借助c,移動到b上去 然后第二步該是把a中的第n個,也就是剩下的那個,直接從a到c去,這一步該是move(1,a,(?),c),答案中用了if語句直接定義這個move(……)就等于printa到c,
2017-02-15 回復 有任何疑惑可以回復我~
#2

qq_玩嵐子_0 提問者 回復 qq_玩嵐子_0 提問者

然后第三步把b中的n-1個借助a移到c,所以是move(n-1,b,a,c) 感覺自己像是完全理解了,怎么說呢,我原來根本不知道move(n,a,b,c)已經定義好了一個映射方式(把n個從a借b移到c)…… 一路從第一章到這里,總覺得少學了點什么……
2017-02-15 回復 有任何疑惑可以回復我~
你別把問題想的那么復雜,你假設n=2?用代碼過一遍,再把2替換成n-1,道理都一樣的,至于n是100,1000還是更多,
讓代碼自己去跑就OK了


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

qq_玩嵐子_0 提問者

感謝!把n=2帶進去看,我覺得自己理解了,但是又像是沒有理解,有點不太懂。現在大概理解了一下,如果你還有時間,請你看這個問題下面我的回答,看看我的理解正不正確,謝謝!
2017-02-15 回復 有任何疑惑可以回復我~

舉報

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

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

進入課程

關于題目中的闡釋

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

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

幫助反饋 APP下載

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

公眾號

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