【发布时间】:2013-09-18 00:35:57
【问题描述】:
我们都知道这个程序
int fact(int n)
{
if(n==0)
return(1);
return(n*fact(n-1));
}
但我不清楚的是内心的事情是如何发生的?
如何计算5*4*3*2*1(如果 n 为 5)
请对此给出明确的解释。
谢谢.....
【问题讨论】:
-
你用调试器单步执行了吗?你会看到的。
我们都知道这个程序
int fact(int n)
{
if(n==0)
return(1);
return(n*fact(n-1));
}
但我不清楚的是内心的事情是如何发生的?
如何计算5*4*3*2*1(如果 n 为 5)
请对此给出明确的解释。
谢谢.....
【问题讨论】:
在数学上,阶乘的递归定义可以这样递归表示(来自Wikipedia):
考虑这对n = 3 是如何工作的,使用== 表示等价:
3! == 2! * 3 == (1! * 2) * 3 == ((1) * 2) * 3
这可以通过重复应用递归规则纯粹象征性地推导出来。
这个定义首先将给定的阶乘扩展为等价的乘法序列。然后它执行实际的乘法运算。您拥有的 C 代码的执行方式完全相同。
【讨论】:
可能有助于理解的是,当您递归调用函数时,新的“循环”将使用 N-1,而不是 N。 这样,一旦你到达 N==0,你调用的最后一个函数将返回 1。此时所有的函数堆栈都在等待嵌套函数的返回。这就是现在您将堆栈中每个函数的结果精确相乘的方式。 换句话说,您将作为输入给出的数字分解。
【讨论】: