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