理解这种递归的困难

时间:2016-06-14 08:30:36

标签: c++ function recursion return

我没有在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 ???

3 个答案:

答案 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堆栈----------条件不符合返回

第二堆栈----------条件完成返回

第一堆---------条件完成返回

希望有所帮助