1樓:某人
我畫張圖來簡單解釋一下吧
由於圖幅有限,只畫了4個呼叫層級,也就是這裡假定n==4時結束遞迴,但不影響解釋。
圖中黑線表示呼叫關係,紅線表示被呼叫函式退出位置和退出後繼續執行的位置。
為了使printf語句執行順序更加明確,我在會執行的printf語句中標明了序號,表示它們先後執行的順序。
所以輸出就是以序號順序:
1 2 3 4 5 6
可見能夠與題主的結果相印證
最終主函式中num結果應該為0
2樓:
遞迴一路進到getPeachNum(9),到結束條件,出來順序 getPeachNum(8) -> 7 -> 6。後半部分列印,從最裡層的9開始。
3樓:「已登出」
應該是每次輸出完遞迴前的那個語句後就重新呼叫了自己,所以遞迴前是正常的1到9,並且每次遞迴的返回值一層套一層,所以最後套到了9才開始返回,故而輸出9到1。
4樓:成風
只有10層,你就是自己寫:
getPeachNumber1
getPeachNumber2
getPeachNumber3
getPeachNumber4
getPeachNumber5
getPeachNumber6
getPeachNumber7
getPeachNumber8
getPeachNumber9
getPeachNumber10
第乙個函式改名字:呼叫部分改為呼叫getPeachNumber2,第二到第十copy第乙個,然後同樣改函式名,呼叫部分,當然if else就不需要了,只需要在第十個函式返回就行了,再除錯跟蹤一下,或許就能理解了。
系統本身對於遞迴沒有特別的注意,呼叫乙個函式而已,只不過是本身。實際由於10個函式邏輯幾乎相同,可以合併在一起,這樣就是遞迴了。另外遞迴函式可以用不遞迴的寫法來寫,只不過理解上比遞迴更麻煩。
5樓:
返回的問題,碰到遞迴不懂就動筆模擬遞迴的過程,畢竟在自然中連while都沒有,所以一步步的畫出來就明白了。
如果還不懂,建議學習下資料結構,重點看下棧那一章。
C語言中呼叫函式change data 和data change data 有什麼區別?
眼鏡獒 change data 或者data change data 哪有data change data 這種又傳位址又返回修改過後的值的?傳了位址就可以直接修改值,為什麼要有個多餘的返回值?有了返回值就可以在外面接收,為什麼又要傳乙個多餘的位址? 差乙個賦值操作。assume data is 1...
c語言是否可以通過呼叫void函式來完成對陣列的賦值?
zr scat 變長陣列啊,c99範疇,vc沒戲,並且陣列在函式引數會退化為指標 如果陣列引數退化成指標,則不知道步長,不行,可以強行傳入步長來搞定 如果只是想初始化為0的話,直接 不必如此麻煩 雲天明 double z不完了麼 void zeros int width,int height,dou...
在C語言中,函式呼叫前是否必須先宣告?
大江 我的理解是,所呼叫函式可能的返回值型別不同占用的記憶體空間大小不一樣的,而返回值是需要放在臨時空間裡的,所以你需要告訴編譯器需要多少的記憶體空間,比如int需要4位元組,double需要8位元組,如果不寫,編譯器假定留出最通用的4位元組給臨時變數。當然這跟規範和標準以及編譯器的實現有關。如果以...