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

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

形參和實參的問題

move(n-1,a,c,b)??#這里c是‘B’,b是“C”嗎?
move(n-1,b,a,c)?#這里b是“A”,a是“B”?嗎?


正在回答

6 回答

這個有點難理解。它只是針對遞歸參數的位置變換,說參數為4ABC不好理解,假設參數4123。這個move(n-1,a,c,b)中c與b的位置進行了換位變成move(n,a,b,c),原本是(4,1,2,3)變成了(4-1,1,3,2),由于3大于1,繼續遞歸,變成(4-1-1,1,2,3),一直到(4-1-1-1,1,3,2)才符合條件進行if語句,輸出1-->2,跳出if判斷,回上一層(4-1-1,1,2,3)再繼續輸出1-->3,(4-1-1,2,1,3),進行遞歸(4-1-1-1,2,3,1)符合if判斷輸入2-->1...就這樣算的,建議用去IDE去用斷點調試一下看看規律?;仡^我把這個遞歸層次全部列出來。

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

Evan233

謝謝大佬的講解,不過還是很想看下遞歸的層次圖,感覺自己的邏輯還不是很清晰,謝謝啦
2018-11-09 回復 有任何疑惑可以回復我~
#2

倚劍生死幻夢情 回復 Evan233

這里面有字數限制,我放下面了,寫的是偽代碼,你將就著看吧,如果還是看不懂,建議跳過來往下學,等其他學好了,再來看這個,其實你要學過遍歷的話,這就是一個深度優先的遍歷。
2018-12-02 回復 有任何疑惑可以回復我~
#3

Evan233 回復 倚劍生死幻夢情

謝謝大佬!了解了!
2018-12-18 回復 有任何疑惑可以回復我~

#if條件不成立的省略

# { 看做遞歸開始

# } 看做遞歸結束

move(4, a, b, c):{? #實際數值(4, A, B, C)

? ? move(3, a, c, b):{? ? ? ? ? ? #c,b調換,實際數值(3, A, C, B), 將這四個值帶入move(3, a, b, c)遞歸1

? ? ? ? move(2, a, c, b):{? ? ? ? #c,b調換,實際數值(2, A, B, C), 將這四個值帶入move(2, a, b, c)遞歸2

? ? ? ? ? ? move(1, a, c, b):{? ? #c,b調換,實際數值(1, A, C, B), 將這四個值帶入move(1, a, b, c)遞歸3

? ? ? ? ? ? ? ? if n == 1:? ? ? ? #此時n==1,if條件成立

? ? ? ? ? ? ? ? print(a, '-->',c) #這是第一次打印A-->B

? ? ? ? ? ? }? ? ? ? ? ? ? ? ? ? ?#最近的一次遞歸3完成,回到遞歸2,實際數值(2, A, B, C)

? ? ? ? ? ? print(a, '-->', c)? ? #這是第二次打印A-->C

? ? ? ? ? ? move(1, b, a, c):{? ? #a,b調換,實際數值(1, B, A, C), 將這四個值帶入move(1, a, b, c)遞歸4

? ? ? ? ? ? ? ? if n == 1:

? ? ? ? ? ? ? ? print(a, '-->', c)#這是第三次打印B-->C? ? ? ??

? ? ? ? ? ? }? ? ? ? ? ? ? ? ? ? ?#最近的一次遞歸4完成,回到遞歸2,實際數值(2, A, B, C)

? ? ? ? }? ? ? ? ? ? ? ? ? ? ? ? ?#最近的一次遞歸2完成,回到遞歸1,實際數值(3, A, C, B)? ? ? ? ? ??

? ? ? ? print(a, '-->', c)? ? ? ? #這是第四次打印A-->B

? ? ? ? move(2, b, a, c):{? ? ? ? #a,b調換, 實際數值(2, C, A, B), 將這四個值帶入move(2, a, b, c)遞歸5

? ? ? ? ? ? move(1, a, c, b):{? ? #c,b調換, 實際數值(1, C, B, A), 將這四個值帶入move(1, a, b, c)遞歸6

? ? ? ? ? ? ? ? if n == 1:

? ? ? ? ? ? ? ? print(a, '-->', c)#這是第五次打印C-->A

? ? ? ? ? ? }? ? ? ? ? ? ? ? ? ? ?#最近的一次遞歸6完成,回到遞歸5,實際數值(2, C, A, B)

? ? ? ? ? ? print(a, '-->', c)? ? #這是第六次打印C-->B

? ? ? ? ? ? move(1, b, a, c):{? ? #a,b調換, 實際數值(1, A, C, B), 將這四個值帶入move(1, a, b, c)遞歸7

? ? ? ? ? ? ? ? if n == 1:

? ? ? ? ? ? ? ? print(a, '-->', c)#這是第七次打印A-->B

? ? ? ? ? ? }? ? ? ? ? ? ? ? ? ? ?#最近的一次遞歸7完成,回到遞歸5,實際數值(2, C, A, B)

? ? ? ? }? ? ? ? ? ? ? ? ? ? ? ? ?#最近的一次遞歸5完成,回到遞歸1,實際數值(3, A, C, B)

? ? }? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#最近的一次遞歸1完成,原參數中的move(n - 1, a, c, b)遞歸全部完成,實際數值(4, A, B, C)

? ? print(a, '-->', c)? #這是第八次打印A-->C,下面跟上面同樣的方式去理解,就不寫了,太累了。

? ? move(3, b, a, c):{

? ? ? ? move(2, a, c, b):{

? ? ? ? ? ? move(1, a, c, b):{

? ? ? ? ? ? ? ? if n == 1:

? ? ? ? ? ? ? ? print(a, '-->', c)? ?#這是第九次打印

? ? ? ? ? ? }

? ? ? ? ? ? print(a, '-->', c)#這是第10次打印

? ? ? ? ? ? move(1, b, a, c):{

? ? ? ? ? ? ? ? if n == 1:

? ? ? ? ? ? ? ? print(a, '-->', c)#這是第11次打印

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? print(a, '-->', c)? ?#這是第12次打印

? ? ? ? move(2, b, a, c):{

? ? ? ? ? ? move(1, a, c, b):{

? ? ? ? ? ? ? ? if n == 1:

? ? ? ? ? ? ? ? print(a, '-->', c)? ?#這是第13次打印

? ? ? ? ? ? }

? ? ? ? ? ? print(a, '-->', c)#這是第14次打印

? ? ? ? ? ? move(1, b, a, c):{

? ? ? ? ? ? ? ? if n == 1:

? ? ? ? ? ? ? ? print(a, '-->', c)#這是第15次打印

? ? ? ? ? ? }

? ? ? ? }? ??

? ? }

}


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

把遞歸放這不是玩火呢

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

還是沒懂啊

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

這只是表現形式問題。這個問題難點一是遞歸本身,第二是表現形式。

第一,把解決問題的思路寫出來(遞歸)

第二,把思路里的每一步轉換成代碼(就是你說的難理解的點,在紙上標示出來或者斷點調試都可以)

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

def move(n-1 , a,b,c),括號中為形參,子程序中不需要明確給定四個變量,

main中使用move()函數時括號中給出實參,四個及以內,main中引用時給出move(3,1,2,3),傳遞到函數中

n=3,a=1,b=2,c=3

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

舉報

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

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

進入課程

形參和實參的問題

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

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

幫助反饋 APP下載

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

公眾號

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