代碼具體是如何運行的?
邏輯我懂,但我不知道為什么要這么寫,定義時move不是還未定義好么?為什么直接用move定義move,還有為什么只有一個print,而且是print 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(4, 'A', '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
求解釋,感激不盡
2020-04-01
? ? ? 我來談談體會吧,網上看了很多,很受啟發,結合自己的思考,把這個問題詳盡解釋一遍?,F在假設我是計算機,我怎么來執行這一串代碼?
當n==1時,直接將a移動到c.?記為a->c.
當n==2時,現實情況是需要b中轉,移動方法為a->b,a->c,b->c.此時我(計算機)是怎么執行這串代碼的呢?由于n==2,if內的語句不執行,現在執行的第一步是move(n-1, a, c, b),即為move(1, a, c, b),由于前面已經定義n==1的操作,即從第一位移動到第三位,此時運行結果為a->b,因此這里c和b必須交換位置才能得到我們想要的結果。接著執行第二步,a->c,這一步很簡單,其現實意義是把a最下面一層移動到c,無論n為多大,這一步都是必不可少的,也是居中的一步。接下來第三步我們需將b移動到c,執行代碼?move(1, b, a, c),執行過程與第一步類似,結果為b->c.當n==2時最終結果為a->b,a->c,b->c。
當n==3時,同樣if后的語句不執行?,F在執行的第一步是move(n-1, a, c, b),即為move(2, a, c, b),前面我們已經得到n==2的運行結果,但是要注意這里的參數已經變位置了,所以結果為a->c,a->b,c->b.第二步,a->c,照搬。第三步,?move(2, b, a, c),同樣是套用n==2時的結果,得b->a,b->c,a->c。當n==3時最終結果a->c,a->b,c->b,a->c,b->a,b->c,a->c。
n==4時調用n==3的結果,這里就不再算了,但我們可以輕易的得出其運行結果必為15步。
……如此,以致無窮。
其實當n比較大時我們現實操作起來是很麻煩的,但是有了電腦,設計好模型,麻煩的計算都交給我們的好哥們去做,我們按輸出的結果一步一步操作必然可以得到我們想要的效果。反思這個模型,當n較大時,反復層層調用,最終執行的卻還是a->c,變量b只起中介作用,站在首位則輸出,末位則入。
相信看了我的推理,你所提到的問題都找到答案了。