[問題] C遞迴將陣列內容反向輸出

作者: x93939512 (ARIA)   2017-10-29 17:47:38
最近剛學C語言 學到了遞迴的部分
在網路上看到了將陣列內容反向輸出的範例
https://pastebin.com/uv3rij55
想請問為什麼那個遞迴副程式可以反向輸出
我的想法 當主程式invert(0)呼叫副程式後
一開始j=0所以小於6進到if
結果又碰到invert(j+1) 又呼叫了一次開始遞迴
這次變成j=1 依照這樣下去當j=6後就不滿足if的條件 跳離遞迴
所以永遠執行不到副程式的printf才對呀!
為什麼這個程式執行的結果卻能達到將list的內容反向?
希望可以解惑一下謝謝
作者: stupid0319 (徵女友)   2017-10-29 17:51:00
j=6後就不再呼叫自己,所以開始脫離retn,呼叫printf?
作者: alan23273850   2017-10-29 18:00:00
請記得一個函式執行完畢之後一定會回來繼續執行下一行,所以每次invert執行完畢之後,一定會繼續往下走到printf,就這樣並不是執行了新的invert之後就不管三七二十一把之前的context取代掉,要這樣的效果可以,但不是初學者會接觸到的內容行,另外我覺得應該把遞迴當成是function call func的一種特例,如果有 code unrolling (展開) 的概念會更清楚,像這張圖 https://imgur.com/28K5WPM如果按照這張圖的方法把所有的invert展開,應該就一目了然了!你就想function只不過就是把一段code壓縮起來,像zip檔那樣子,要執行到的時候再展開BTW,我覺得這種寫法蠻有創意的,但以這個問題來說這絕對不是好解法
作者: flowwinds (..)   2017-10-30 09:11:00
想成invert都分為兩部分:第一個元素及array其他的部分invert第一個元素最後才印出, 所以先invert array其他部分?

Links booklink

Contact Us: admin [ a t ] ucptt.com