在递归中使用引用传递
Use pass by reference in recursion
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);
在上面的例子中,有四个可能的答案可供选择:
- 3024
- 6561
- 55440
- 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
的取值是不顺序的;因此,求值顺序是未指定的。
这并不意味着求值顺序将是某个特定的求值顺序,只需要弄清楚它。这意味着最终结果可以:
-
此程序每次执行时变化
-
对于每个单独的递归调用,求值顺序也可能不同。每个递归调用最终也可以使用不同的求值顺序。"未指定"指"未指定"。任何可能性都有可能发生。
我没有费心去计算所有实际的可能性。最好把自己的时间花在应该正常工作的事情上,而不是花在显然永远不会正常工作的事情上。
如果你想要一个特定的求值顺序,它将是这样的:
int y=x;
return f(x, c) * y;
或:
int y=f(x, c);
return y * x;
相关文章:
- 棘手的按值传递和按引用递归问题传递
- 如果我们通过引用传递变量,则递归中使用的堆栈空间量是否为零?
- 递归中的引用
- 为什么当函数参数未定义为常量引用时存在无限递归?
- 尾递归,带有通过引用传递的向量
- C++ 引用类型作为递归函数参数
- 递归中的 C++ 引用(反转堆栈)
- 如何在递归函数中调用引用数组?
- 你能在递归 lambda 中捕获引用吗?
- 递归到迭代而不重新绑定引用
- 对具有传递引用参数的函数使用递归
- 静态短引用在递归函数中产生错误
- C++:使用递归和引用变量查找数组中的最大元素
- 在递归循环中条件修改的引用内存
- 如何在 c++ 中将内置堆栈作为对递归函数的引用传递
- 引用指针的递归调用和赋值
- 递归 lambda 通过引用
- 为什么通过引用传递可以修复我的递归错误
- 如何使用向量通过指针引用递归结构
- 通过引用递归函数传递字符串或流对象时出现的段错误