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

看板C_and_CPP (C/C++)作者 (無骨雞腿排)時間8年前 (2017/10/29 17:47), 8年前編輯推噓2(2017)
留言19則, 3人參與, 8年前最新討論串1/1
最近剛學C語言 學到了遞迴的部分 在網路上看到了將陣列內容反向輸出的範例 https://pastebin.com/uv3rij55 想請問為什麼那個遞迴副程式可以反向輸出 我的想法 當主程式invert(0)呼叫副程式後 一開始j=0所以小於6進到if 結果又碰到invert(j+1) 又呼叫了一次開始遞迴 這次變成j=1 依照這樣下去當j=6後就不滿足if的條件 跳離遞迴 所以永遠執行不到副程式的printf才對呀! 為什麼這個程式執行的結果卻能達到將list的內容反向? 希望可以解惑一下謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 115.82.112.209 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1509270461.A.84F.html ※ 編輯: x93939512 (115.82.112.209), 10/29/2017 17:48:42

10/29 17:51, 8年前 , 1F
j=6後就不再呼叫自己,所以開始脫離retn,呼叫printf?
10/29 17:51, 1F

10/29 18:00, 8年前 , 2F
請記得一個函式執行完畢之後一定會回來繼續執行下一
10/29 18:00, 2F

10/29 18:01, 8年前 , 3F
行,所以每次invert執行完畢之後,一定會繼續往下走
10/29 18:01, 3F

10/29 18:01, 8年前 , 4F
到printf,就這樣
10/29 18:01, 4F

10/29 18:02, 8年前 , 5F
並不是執行了新的invert之後就不管三七二十一把之前
10/29 18:02, 5F
※ 編輯: x93939512 (115.82.112.209), 10/29/2017 18:02:18

10/29 18:02, 8年前 , 6F
的context取代掉,要這樣的效果可以,但不是初學者
10/29 18:02, 6F

10/29 18:02, 8年前 , 7F
會接觸到的內容
10/29 18:02, 7F
所以我能這樣理解嗎? 當j=0的時候要進到invert(j+1)前 電腦會在這邊設個傳點1 告訴我等等記得回來執行printf 依此類推j=5時會設傳點6 而我j=6時跳出if 電腦會知道我遞迴結束了 然後由傳點6的printf依序輸出到傳點1的printf這樣對嗎?謝謝 ※ 編輯: x93939512 (115.82.112.209), 10/29/2017 18:22:59

10/29 18:38, 8年前 , 8F
行,另外我覺得應該把遞迴當成是function call func
10/29 18:38, 8F

10/29 18:38, 8年前 , 9F
的一種特例,如果有 code unrolling (展開) 的概念
10/29 18:38, 9F

10/29 18:38, 8年前 , 10F
會更清楚,像這張圖 https://imgur.com/28K5WPM
10/29 18:38, 10F

10/29 18:39, 8年前 , 11F
如果按照這張圖的方法把所有的invert展開,應該就一
10/29 18:39, 11F

10/29 18:39, 8年前 , 12F
目了然了!
10/29 18:39, 12F

10/29 18:40, 8年前 , 13F
你就想function只不過就是把一段code壓縮起來,像
10/29 18:40, 13F

10/29 18:40, 8年前 , 14F
zip檔那樣子,要執行到的時候再展開
10/29 18:40, 14F
感謝說明終於懂了xD 自己想了好久,那張圖很清楚! 謝謝

10/29 18:46, 8年前 , 15F
BTW,我覺得這種寫法蠻有創意的,但以這個問題來說
10/29 18:46, 15F

10/29 18:46, 8年前 , 16F
這絕對不是好解法
10/29 18:46, 16F
不過也剛好讓我這新手 能夠搞懂一些觀念 雖然我真的想破頭超久>< ※ 編輯: x93939512 (115.82.112.209), 10/29/2017 18:46:51 ※ 編輯: x93939512 (115.82.112.209), 10/29/2017 18:48:25

10/30 09:11, 8年前 , 17F
想成invert都分為兩部分:第一個元素及array其他的部分
10/30 09:11, 17F

10/30 09:13, 8年前 , 18F
invert第一個元素最後才印出, 所以先invert array其他
10/30 09:13, 18F

10/30 09:13, 8年前 , 19F
部分?
10/30 09:13, 19F
文章代碼(AID): #1PzQEzXF (C_and_CPP)
文章代碼(AID): #1PzQEzXF (C_and_CPP)