[問題] 基本遞迴想不通

看板C_and_CPP (C/C++)作者 ( )時間12年前 (2013/09/30 00:47), 編輯推噓2(209)
留言11則, 6人參與, 最新討論串1/1
1 #include<stdio.h> 2 void test(int); 3 int main(void) 4 { 5 test(1); 6 return 0; 7 } 8 9 void test(int a) 10 { 11 printf("%d ",a); 12 if (a<4) 13 test(n+1); 14 printf("%d ",a); //#2 15 } 輸出結果是 1 2 3 4 4 3 2 1 我懂 1 2 3 4 4,但後面 3 2 1怎麼來的,書上寫的我看不太懂 它說到第2個4輸出後,程式會執行return,控制權會回到呼叫它的函數,也就是第3層呼叫 而第3層之前所執行的敘述是在if裡呼叫第4層,此時第3層會繼續從下一個敘述開始 也就是#2,所以第3層會被輸出(印出3),結束後又回到第2層,以此類推 第2個4輸出後,程式會執行return? 可是return不就是已經結束了嗎? 還是這個return指的是不是main裡面的? 為何控制權會回到呼叫它的函數呢? 想不透啊~新手來請教一下~謝謝各位! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 36.226.51.212

09/30 00:53, , 1F
call一次test會有兩個printf啊
09/30 00:53, 1F

09/30 00:54, , 2F
我在講解遞迴都會說呼叫一次就是叫一個影分身出來
09/30 00:54, 2F

09/30 00:54, , 3F
所以某一個影分身的動作是印一次 叫分身 再印一次
09/30 00:54, 3F

09/30 00:55, , 4F
第二個"印一次"就會印出後面的結果了
09/30 00:55, 4F

09/30 08:38, , 5F
你的盲點可能在 return 是回到 caller function 不是結束
09/30 08:38, 5F

09/30 08:39, , 6F
然後 test() 的最後有一個沒寫出來但仍然存在的 return;
09/30 08:39, 6F

09/30 09:12, , 7F
就在#2的下一行,你可以想成return void沒寫會自動補上
09/30 09:12, 7F

09/30 09:56, , 8F
謝謝大家喔~大概懂是什麼原因了,我再多看範例來學
09/30 09:56, 8F

10/01 16:51, , 9F
因為Function call 是stack方式運作阿
10/01 16:51, 9F

10/04 11:49, , 10F
推樓上
10/04 11:49, 10F

10/04 11:50, , 11F
不過我覺得可以先畫成樹狀圖
10/04 11:50, 11F
文章代碼(AID): #1II5cDg8 (C_and_CPP)
文章代碼(AID): #1II5cDg8 (C_and_CPP)