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

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

完全沒看懂A-->C的這步在程序里是怎么體現的

def move(n, a, b, c):
??? if n==1:
??????? print a,'-->',c
??????? return
??? move(n-1,a,c,b)
??? print a,'-->',c
??? move(n-1,b,a,c)

move(10, 'A', 'B', 'C')

我試了好幾個N值,不明白為什么A-->B之后輸出的是A-->C

正在回答

5 回答


def move(n,a,b,c):? //這里是函數的定義部分,有四個形參,分別對應圓盤個數,a位置的圓盤名字,b位置的圓盤名字,c位置的圓盤名字它可以不是A,也可是A,后面兩個同理

if n==1:? //判斷n的值是否符合,符合才執行

????print a,'-->',c//將a位置的圓盤名字和c位置的圓盤名字輸出

????return //返回值為空,不加返回內存會溢出,程序不停止而超時

move (n-1,a,c,b)//這里函數調用自身,你可能會疑惑它要怎樣輸出,但你現在先要進入這個函數的運算,才能執行下一步,然后它就會反復判斷,一直到n=1,這時候你的move(2,a,b,c)遞歸是這樣子滴,

/*??? def move(2,a,b,c):

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

????????????????????print a,'-->',c

????????????????????return

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

?????????????print a,'-->',c

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

*/

而你要清楚n=1,函數值return none,釋放內存,程序終止不再執行后面語句,所以move(1,a,c,b)函數輸出為

A-->B,接著在move(2,a,b,c)函數體中,接著print a,'-->',c執行語句,輸出為A--C,再接著move(1,b,a,c),有輸出為B-->C,此時move(2,a,b,c)語句結束。

為什么我會說是語句呢?別忘了,這個move(2,a,b,c)只是在move(3,a,c,b)“函數體”中的一個語句而已,既然move(2,a,b,c)語句結束,那后面接著print a,'-->',c執行語句,注意此時的函數體為move(3,a,c,b),所以輸出為A-->B,后面接著move(2,c,a,b)語句,輸出的方法和前面move(2,a,b,c)相同,但結果不同。

所以,如果要理解遞歸,你要抽絲剝繭,找到循環終止的位置,從終止的位置出發,一直到你開始的地方,結合后面圖片,理解應該更好點。

講的不好,請見諒。

圖片略大,上傳不了,有心想學會遞歸的人可以移步網盤,不難。

鏈接為https://pan.baidu.com/s/1tSxvKxeC9qxZdb7vWlKI7Q,無密碼。


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

彈指一揮丶

請教下def move(2,a,b,c):里面兩個print是怎么print出來3行結果呢?最后一個print后的move(n-1,b,a,c)是怎么循環的呢?
2018-08-03 回復 有任何疑惑可以回復我~
#2

sunny超1 回復 彈指一揮丶

回答里都說明了,你可以看看圖片。
2018-08-03 回復 有任何疑惑可以回復我~
#3

彈指一揮丶 回復 sunny超1

就是不太明白里面2個print怎么打印出3行結果的?還有最后一行代碼move(n-1,b,a,c)在里面有什么作用呢?
2018-08-06 回復 有任何疑惑可以回復我~
#4

Sumh

“接著在move(2,a,b,c)函數體中,接著print a,'-->',c執行語句,輸出為A--C,再接著move(1,b,a,c),有輸出為B-->C,此時move(2,a,b,c)語句結束。”不太懂,這個執行的順序,這個函數體的執行順序,為啥是這樣的呀?
2018-08-17 回復 有任何疑惑可以回復我~
#5

sunny超1 回復 Sumh

后面有解釋…
2018-08-17 回復 有任何疑惑可以回復我~
查看2條回復

下面是步驟https://img1.sycdn.imooc.com//5b3b2463000168cc04600190.jpghttps://img1.sycdn.imooc.com//5b3b2465000168cc04600190.jpg

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

大臉貓 提問者

能解釋下這個函數的返回順序嗎? A --> C A --> B C --> B A --> C B --> A B --> C A --> C
2018-07-04 回復 有任何疑惑可以回復我~
#2

慕婉清9415352 回復 大臉貓 提問者

假設A柱子上從上到下有1,2,3三個圓盤,首先將1移到C,將2移到B,然后將1從C移到B,B此時有1,2兩個圓盤,A有3一個圓盤,C沒有圓盤。將3從A移到C,將1從B移到A,將2從B移到C,此時A有1一個圓盤,B無圓盤,C有2,3兩個圓盤。最后將1從A移到C,C有1,2,3三個圓盤。
2018-07-09 回復 有任何疑惑可以回復我~

https://img1.sycdn.imooc.com//5b3b18820001ea1702950182.jpg這里A-->C

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

大臉貓 提問者

我還有個問題能否解答下,這個函數在運行的時候,是否是先把字符A,B,C賦予到了最初的形參a,b,c上再開始調用遞歸的?還是先調用遞歸,最后再賦值
2018-07-03 回復 有任何疑惑可以回復我~

額,都解釋的這么清楚了。。。https://img1.sycdn.imooc.com//5b3b18420001c27c03270190.jpg

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

因為漢諾塔游戲是有A,B,C三根帶圓盤底座的柱子,假設A上有從上到下依次排列的3個圓盤,上面的最小,下面的最大。根據漢諾塔規則,一次必須移動一個且小的那個永遠在最上面。所以先從A中拿取相對最小的一個放在B上,即A--->B,此時A上還有2個,再一次移動A上相對小的一個,此時根據規則大的總在小的下面,所以只能是移動到C,即A--->C

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

大臉貓 提問者

我是在問程序里面哪一條語句可以打印出A-->C啊。。。不是問游戲該怎么玩。
2018-07-03 回復 有任何疑惑可以回復我~
#2

大臉貓 提問者

錯了,是哪條語句可以在A--B后面打印出A--C
2018-07-03 回復 有任何疑惑可以回復我~

舉報

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

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

進入課程

完全沒看懂A-->C的這步在程序里是怎么體現的

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

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

幫助反饋 APP下載

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

公眾號

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