1 回答

TA貢獻58條經(jīng)驗 獲得超75個贊
這是遞歸的典型應用。下面通俗的說明一下,主要明白意思,就好懂了。
??def?move(n,?a,?b,?c):?#這一句是定義move函數(shù),其中n是盤子的數(shù)量,a是源柱,b是輔助柱子,c是目標柱子
if?n==1:??????? ????print?a,'-->',c ????return
這段語句的意思是,當盤子只有1個的時候,就直接輸出,將那個盤子從a柱移到c柱。并且會結束代碼的執(zhí)行!因為n=1是遞歸的邊界條件(當你以后學算法學到遞歸的時候就知道了,每個遞歸程序都有一個邊界條件,用于結束循環(huán),跳出代碼的執(zhí)行)。
另外,else可以不加,因為如果你給的n是1,自然會執(zhí)行if語句,如果不是1,自然順序執(zhí)行if后面的語句,不加也是可以的。
?move(n-1,a,c,b)
從這里開始,就是函數(shù)的遞歸調用了(自己調用自己)。當有n個盤子的時候(n !=1),我們首先要將前面的n-1個盤子先移走,即將盤子從原柱通過目標柱移到輔助柱上,此時參數(shù)中的c實際就相當于是輔助柱了,所以有下面的語句進行路徑輸出
print?a,'-->',c
移到輔助柱上當然是不夠的,還要將輔助柱上的盤子移到目標柱去,所以下面的語句
move(n-1,b,a,c)
原先輔助柱b此時就是原柱了,將通過a作為輔助移到目標柱c上去。整個過程會重復的執(zhí)行,比如最先執(zhí)行的n-1,在n-1執(zhí)行時,又會先將n-1個盤子的前n-1個盤子(即n-2)進行移動,以此遞歸,直到邊界條件,當n為1時,就輸出了最開始的那句話。
所以上面你有個問題是move為什么可以隨意移動,原因就是遞歸函數(shù)自己調用自己,自己可以按照既定的規(guī)則移動,那參數(shù)的順序改變了,每個參數(shù)代表的含義也不一樣了,原來的目標柱在后續(xù)的移動步驟中可能就是輔助柱了,但移動的規(guī)則還是沒變。所以遞歸的代碼簡潔難懂,就是這樣的。
添加回答
舉報