在递归中使用按引用传递

Dim*_* Nt 4 c++ recursion reference

int f(int &x, int c) 
{
     c  = c - 1;
     if (c == 0) return 1;
     x = x + 1;
     return f(x, c) * x;
} 

int x = 5;
cout << f(x,5);
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,可供选择的四个可能答案是:

  1. 3024
  2. 6561
  3. 55440
  4. 161051

函数f(int&x,int c)在第一次调用之后被调用四次,然后到达返回结果为6561的基本情况.我的猜测是3024,但我错了.即使通过引用传递的x变量在每次调用f(int&x,int c)时递增并分别取值6-> 7-> 8-> 9,此递归的最终结果等于9 ^ 4.所以我的问题是:变量x通过引用传递,当它到达基本情况时等于9.这是否意味着递归的所有阶段都将具有变量x的这个值,即使它们在被调用时具有不同的值?

Sam*_*hik 6

不,有四个以上的答案可供选择.

取指令的x用于递归函数调用,并且取的x乘法的右手侧,不与彼此测序; 因此,评估顺序未指定.

这并不意味着评估订单将是某个特定的评估订单,而且只需要弄清楚它.这意味着最终结果可以:

  1. 根据编译器的不同而不同.

  2. 每次执行此程序时都会发生变化.

  3. 对于每个单独的递归调用,评估顺序也可以是不同的.每个递归调用也可以最终使用不同的评估顺序."未指定"表示"未指定".任何可能性都会发生.每个人的时间.

我没有在这里计算所有实际可能性.最好将自己的时间投入到应该正常工作的事情上,而不是放在显然无法正常工作的事情上.

如果您需要特定的评估订单,它将是:

int y=x;

return f(x, c) * y;
Run Code Online (Sandbox Code Playgroud)

或这个:

int y=f(x, c);

return y * x;
Run Code Online (Sandbox Code Playgroud)

现在指定此评估顺序.