不是很懂其中的過程
執行的結果為什么是下面這樣?
?A --> B?
A --> C?
B --> C?
A --> B?
C --> A?
C --> B?
A --> B?
A --> C?
B --> C?
B --> A?
C --> A?
B --> C?
A --> B?
A --> C?
B --> C
執行的結果為什么是下面這樣?
?A --> B?
A --> C?
B --> C?
A --> B?
C --> A?
C --> B?
A --> B?
A --> C?
B --> C?
B --> A?
C --> A?
B --> C?
A --> B?
A --> C?
B --> C
2018-07-14
舉報
2018-07-17
那好,我就講輸出的順序了,這個遞歸函數你要明白,只有if條件滿足時,才會輸出,而滿足條件的唯一條件時n=1,讓n=1的函數只能是move(1,a,c,b)和move(1,b,a,c),這兩個怎么來的,從第一個move(4,a,b,c)推導就知道了,當滿足了第一個move(1,a,c,b),你就可以按照定義的函數執行語句順序來了,接著print a,'-->',c,注意這里a和c只是把a和c位置上的數輸出,不是a與c。再接著move(1,b,a,c),然后這個時候你要意識到,你只是完成了move(2,a,b,c)的輸出,接著在move(3,```,```,```)這個函數體內,你有接著像move(1)一樣輸出move(2)了。后面其他也是這樣。
2018-07-14
算了,圖片略大,上傳不了,有心想學會遞歸的人可以移步網盤,不難。
鏈接為https://pan.baidu.com/s/1tSxvKxeC9qxZdb7vWlKI7Q,無密碼。
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)相同,但結果不同。
所以,如果要理解遞歸,你要抽絲剝繭,找到循環終止的位置,從終止的位置出發,一直到你開始的地方,結合后面圖片,理解應該更好點。
講的不好,請見諒。