完全沒看懂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
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
2018-07-03
舉報
2018-07-14
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,無密碼。
2018-07-03
下面是步驟

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