[問題] 關於遞迴函式的一點問題

作者: oo855050 (阿偉)   2020-03-13 23:57:31
版上各位好,
小弟最近剛學C++
目前看到遞迴函式的地方有點小問題
遞迴函式的經典範例就是拿來計算階乘
但我有一個地方有點不太懂
程式碼如下 :
int factorial(int n) {
if (n == 1)
return 1;
else
return (n * factorial(n - 1));
}
在輸入的n不為1的時候會一直不斷地呼叫自己做計算
當n==1時停止
但當它不斷呼叫自己直至n=1時不是會被return 1嗎?
為何最終的答案還是階乘正確計算的數值呢?
請教版上各位大神解答
感謝!
作者: cuteSquirrel (松鼠)   2020-03-14 00:02:00
1*2*3*...n-1*n 會從內而外乘回來紙上畫個圖,或者print執行過程 追蹤一下就知道了
作者: poolongkong (普攏貢)   2020-03-14 00:34:00
https://pastebin.com/5RnNWXrT 看看這樣能不能理解
作者: chiya0219 (chiya)   2020-03-14 01:20:00
我寫的是c 然後n<1就 return 1 想請問 我原本打成return 0 然後輸入4的時候 一樣輸出會是0 這是為何
作者: Lipraxde (Lipraxde)   2020-03-14 01:53:00
因為 "0 * n = 0 " 啊
作者: LPH66 (-6.2598534e+18f)   2020-03-14 05:06:00
每呼叫一次就多一層, 一個 return 只有回傳一層而已
作者: chiya0219 (chiya)   2020-03-14 10:09:00
可是我n=4的時候不是應該return n*facetorial(n-1)嗎怎麼跟return0有關係
作者: b0920075 (Void)   2020-03-14 10:20:00
阿最下層的遞迴不就是1*fact(0),你又寫成fact(0) return 0,不就變成1*0,那每一層都是*0阿而且0!也會是1,這個從最根本的地方就錯了吧
作者: CoNsTaR ((const *))   2020-03-14 14:32:00
你一年的最後一小時賺 500 塊你年薪就 500 嗎 XD
作者: oo855050 (阿偉)   2020-03-14 21:59:00
pool大網址裡的解釋這樣我就懂了!感謝!!這邊感謝大家的回覆^_^
作者: LPH66 (-6.2598534e+18f)   2020-03-14 22:31:00
於是這裡再來推廣觀念: 遞迴就是數學歸納法fact(0) return 0 的問題就是基礎狀況不一樣所以結果不一樣
作者: fragmentwing (片翼碎夢)   2020-03-31 15:33:00
查一下阿卡曼方程 實做上不會很難很雜 做完這個會很清楚理解遞歸背後的運作機制

Links booklink

Contact Us: admin [ a t ] ucptt.com