亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

關于參數位置的問題

代碼小白,也許是白癡問題,請勿笑

假設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中參數交換到底是一個什么意義的操作?

正在回答

4 回答

我來把整段代碼解釋一下吧!希望能解決你的問題。

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盤中。 ?

1 回復 有任何疑惑可以回復我~
#1

優曇華 提問者

我能這么理解么,def的move中的abc是形參,函數中的move是在使用函數而非定義函數,所以其中的acb是傳入實參,相當于將函數中move的acb賦予def的abc?
2017-07-23 回復 有任何疑惑可以回復我~
#2

鄭安潤

對的對的!真好,你沒有被我一不小心的錯誤用詞誤導,冒號以下的move確實是在使用函數而非定義函數。 關于參數問題,我覺得可以這樣理解,不管字母是哪個,只要記住字母的位置即可。以此問題為例,這個move()函數定義的就是將第一個位置的移動到第三個位置的,這點永遠不變,不管字母如何變化。
2017-07-23 回復 有任何疑惑可以回復我~
#3

森滿

您的意思是到return這里這個函數就定義完畢,接下來就是使用這個函數?那么為什么n=4,3,2時不是返回none而是a-->b?求解答
2017-08-08 回復 有任何疑惑可以回復我~

傷心傷心,寫了那么長發現你已經采用了別的回答,但是我覺得他的回答跟搜到的答案一樣,沒有說到每一層它是怎樣的而且他說的也不對,有兩個print a-->c 語句,我暫且把在條件中的那個叫第一個,下面的叫第二個,第二個確實是始終是從A 移到C(不過它就只執行一次)然后第一個就要對應當前層的實參是什么,實際上第二個也是同理的,因為它對應的實參已經確定了啊,a就是A,c 就是C

1 回復 有任何疑惑可以回復我~
#1

鄭安潤

贊同你的說法!我雖然懂了,但表達得不夠好,謝謝指教。
2017-07-23 回復 有任何疑惑可以回復我~
#2

優曇華 提問者

只能采用一個答案真是可惜,如果可能你們的答案我都想采納,感謝大佬們的熱心幫助!OTZ
2017-07-24 回復 有任何疑惑可以回復我~

對的,你的理解是正確的。我再幫你清晰一點,就先比如你說的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這個語句。

1 回復 有任何疑惑可以回復我~
#1

鄭安潤

哎呦,這樣說得太容易讓人搞暈。 關于參數問題,我覺得可以這樣理解,不管字母是哪個,只要記住字母的位置即可。以此問題為例,這個move()函數定義的就是將第一個位置的移動到第三個位置的,這點永遠不變,不管字母如何變化。
2017-07-23 回復 有任何疑惑可以回復我~

最簡單的理解是,自左-->右,依次清空自己柱上的盤子,僅留一個。第一次,把a,移到b,然后再繼續轉移。只能理解,這個沒法細說

1 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消
初識Python
  • 參與學習       758383    人
  • 解答問題       8967    個

學python入門視頻教程,讓你快速入門并能編寫簡單的Python程序

進入課程

關于參數位置的問題

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號