[问题] 关于递回函式的一点问题

楼主: 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