c語言函式遞迴呼叫自身,數字就變倒序的了呢

時間 2021-06-04 15:56:39

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位元組給臨時變數。當然這跟規範和標準以及編譯器的實現有關。如果以...