我没有在C ++中进行这种递归练习。这是:
int fatt(int x){
int s=1; // here. since 's' will always be 1 shouldn't i get 1 as an output???
if(x>1) { s = x*fatt(x-1); }
return s;
}
int main()
{
int n;
cout << "Type a number: ";
cin >> n;
if (n < 0) { cout << "Error" << endl; }
if (n <=1) { cout << "Factorial: 1" << endl; }
else { cout << "Factorial: " << fatt(n) << endl; }
}
如果我放s=0
它会将我作为输出返回0
,如果我放2它会使结果加倍O.o我不知道它是如何工作的。我知道x
总是越来越小,直到达到2并且返回结果但是每次调用函数都不应该被赋予值1 ???
答案 0 :(得分:3)
假设您使用参数值3调用该函数:它看起来像这样:
int fatt(3) {
int s = 1;
if (3 > 1) s = 3 * fatt(3 - 1);
return s;
}
所以s是校正3 * fatt(2)
的结果,而fatt(2)
的结果是:
int fatt(2) {
int s = 1;
if (2 > 1) s = 2 * fatt(2 - 1);
return s;
}
因此s是计算2 * fatt(1)
的结果,而fatt(1)
的结果是:
int fatt(1) {
int s = 1;
if (1 > 1) s = 1 * fatt(1 - 1); // False so this is never executed.
return s;
}
fatt(1)
的结果是1.这就是我们回到fatt(2)
的调用,然后转换为:
s = 2 * 1;
给出结果2,然后返回fatt(3)
的调用,然后给出:
s = 3 * 2;
结果为6。
请记住,每次执行函数时,局部变量s都会被压入堆栈。所以它不是同一个变量。
如果您将s发起为2,则第一行将显示为:s = 2 * 2;
,其余部分将使结果中的值加倍。由于s
实际上是你最终在你的阶乘中乘以的因素:
所以序列:3 * 2 * 1
变为3 * 2 * 2
。
答案 1 :(得分:1)
变量s
是函数fatt
的给定实例化的本地变量。当函数以递归方式调用自身时,每次调用都会获得自己的s
新副本。这初始化为1,但不会影响堆栈中较低的所有先前s
个实例。然后,在将fatt
调用的结果乘以x
的本地副本后,将其中的每一个分配到.when('/:path.aspx', {
templateUrl : 'src/ng-app/views/posts/post.html',
controller : 'postController'
})
调用的结果。
答案 2 :(得分:0)
&#39; S&#39;应为1,但它会被赋值,然后在完成函数时更改它所持有的值。
起初可能有点难以理解,但一旦你这样做,它就很漂亮。
我建议你用笔和纸。
1)设x = 3;
int fatt(3) {
int s = 1;
if (3 > 1) s = 3 * fatt(3 - 1);
return s;}
2)在函数3> 1 =真,所以它再次传递,但这次是(3-1),即2
注意:功能未执行
3)现在x = 2
int fatt(2) {
int s = 1;
if (2 > 1) s = 2 * fatt(2 - 1);
return s;}
4)重复步骤2)(2-1),即1
5)因为x不是&gt;在第3次函数调用中,这导致返回s
s = 1;
return s;
因此...
从第2个函数调用开始:
s = x * fatt(x-1);
s = 2 * 1;
return s;
第一次呼叫再次重复此操作)
s = x * fatt(x-1);
s = 3 * 2;
return s;
把它想象成一堆函数
第一堆栈-------调用堆栈2并等待
第二堆栈----------调用堆栈3并等待
第一堆----------等待
...最后
第3堆栈----------条件不符合返回
第二堆栈----------条件完成返回
第一堆---------条件完成返回
希望有所帮助