關于參數位置的問題
代碼小白,也許是白癡問題,請勿笑
假設n初始值為2,結果為A-->B,A-->C,B-->C
第一次循環,到內層第一個move處,n變為n-1即1,所以在此處應輸出if中的print,但因為move中b、c交換了位置,使得本應輸出的A-->C變成了A-->B,是不是意味著if中的參數a、b只代表最外層move中形參的位置,而不是具體的某個參數?
內層move中參數交換到底是一個什么意義的操作?
代碼小白,也許是白癡問題,請勿笑
假設n初始值為2,結果為A-->B,A-->C,B-->C
第一次循環,到內層第一個move處,n變為n-1即1,所以在此處應輸出if中的print,但因為move中b、c交換了位置,使得本應輸出的A-->C變成了A-->B,是不是意味著if中的參數a、b只代表最外層move中形參的位置,而不是具體的某個參數?
內層move中參數交換到底是一個什么意義的操作?
2017-07-23
舉報
2017-07-23
我來把整段代碼解釋一下吧!希望能解決你的問題。
def move(n, a, b, c): ? ?#定義一個函數(由下面代碼的“a, '-->', c”可以看出,該函數的最終目的是要將a柱中的n個盤子全部移動到c柱中)。
??? if n==1:
??????? print a,'-->',c ? ? ? #只有一個盤子時,只需將其從a柱移動到c柱,一步到位。
??????? return
??? move(n-1,a,c,b) ? ? ? #這一行代碼可以理解成是在繼續定義函數,可以看出,與原始函數相比較,b與c的位置互換了,表示將a柱中的n-1個盤子移動到b柱中,b柱中就總共有n-1個盤子。那么,a柱中就只剩下最下面一個盤子了。
??? print a,'-->',c ? ? ? ? ? #然后一步是,將a柱中的盤子即剩下的最下面那個盤子移動到c柱中。
??? move (n-1,b,a,c) ? ? ?#接著定義函數,可以看出,與原始函數相比較,a與b的位置互換了,表示將b柱中的n-1個盤子(b柱中總共n-1個盤子)全部移動到c盤中。
move(4, 'A', 'B', 'C') ? ? #輸出利用‘B’這個中轉站將‘A’中的4個元素按順序替換到'C'中的結果。
再提個醒哦:move()代表的是一個函數,“因為move中b、c交換了位置,使得本應輸出的A-->C變成了A-->B”這種理解欠妥哦,?move(n, a, b, c)這行代碼即表示將a柱中的n個盤子全部移動到c柱中(包含所要進行的所有步驟),而move(n-1,a,c,b)這行代碼表示的是將a柱中的n-1個盤子移動到b柱中(包含所要進行的所有步驟),而move(n-1,a,c,b)與下面的那行代碼?print a,'-->',c是分開的,print a, '-->', c 始終表示將a柱中的盤子移動到c盤中。 ?
2017-07-23
傷心傷心,寫了那么長發現你已經采用了別的回答,但是我覺得他的回答跟搜到的答案一樣,沒有說到每一層它是怎樣的而且他說的也不對,有兩個print a-->c 語句,我暫且把在條件中的那個叫第一個,下面的叫第二個,第二個確實是始終是從A 移到C(不過它就只執行一次)然后第一個就要對應當前層的實參是什么,實際上第二個也是同理的,因為它對應的實參已經確定了啊,a就是A,c 就是C
2017-07-23
對的,你的理解是正確的。我再幫你清晰一點,就先比如你說的n=2,在外層中,也就是move(2,A,B,C)中a=A,b=B,c=C,然后在這一層,先運行move(1,a,c,b),這里是進入到了第二層,它對應的a=A,b=C,c=B,因為n=1了,所以,它就執行a-->c,也就是A-->C,此時第二層執行完了,返回上一層,注意,每一層對應的是實參是什么,計算機會貯存起來,返回來就對應執行,所以返回到外層了,對應的abc就是a=A,b=B,c=C,所以執行下一步的print a-->c 就是A-->C 了。然后下面move(1,b,a,c)同理。
所以參數交換的意義就是在于對應print a-->c這個語句。
2017-07-23
最簡單的理解是,自左-->右,依次清空自己柱上的盤子,僅留一個。第一次,把a,移到b,然后再繼續轉移。只能理解,這個沒法細說