在递归中使用引用传递

Use pass by reference in recursion

本文关键字:引用 递归      更新时间:2023-10-16
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);

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

  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的这个值,即使它们在被调用时具有不同的值?

不,可供选择的答案不止四个。

递归函数调用的x的取值和乘法右边的x的取值是不顺序的;因此,求值顺序是未指定的。

这并不意味着求值顺序将是某个特定的求值顺序,只需要弄清楚它。这意味着最终结果可以:

  1. 此程序每次执行时变化

  2. 对于每个单独的递归调用,求值顺序也可能不同。每个递归调用最终也可以使用不同的求值顺序。"未指定"指"未指定"。任何可能性都有可能发生。

我没有费心去计算所有实际的可能性。最好把自己的时间花在应该正常工作的事情上,而不是花在显然永远不会正常工作的事情上。

如果你想要一个特定的求值顺序,它将是这样的:

int y=x;
return f(x, c) * y;

或:

int y=f(x, c);
return y * x;