gpt4 book ai didi

c++ - 为什么此代码返回 6561?

转载 作者:行者123 更新时间:2023-11-30 02:48:47 25 4
gpt4 key购买 nike

我正在学习按引用调用函数和按值调用函数,但我在发现它返回 6561 的原因时遇到了问题。

在我的主函数中,我调用了一个函数 f(p,p) ,其中 p 在调用前被初始化为 5。

我将函数 f 定义为:

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

为什么这段代码返回 6561

最佳答案

这个函数对于学习引用来说是一个相当复杂的函数,因为要理解第一个参数作为引用传递的含义,您首先需要理解递归的本质。

让我重复你的代码:

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

显然某处还有另一个函数包含这样的代码:

int p = 5;
result = f(p, p);

首先要注意的是它递归地调用自己。参数c作为一个计数器来限制递归调用的次数。它在 f() 的第一行递减,当它减少到 0 时,递归停止(仅返回 1)。

由于 p 被初始化为 5,递归将在 5 次调用后终止。

f() 的第 4 行中,参数 x 递增。

最后一行递归调用传递了 x 的引用和递减的 c。

显然该函数返回 6561 作为结果,即 9*9*9*9(相当于 9*9*9*9*1)。这是对这里发生的事情的提示。

让我们通过递归跟踪数据:

#0:条目:x=5,c=5,就在最后一行之前:x=6,x=4
#1:条目:x=6,c=4,就在最后一行之前:x=7,x=3
#2:条目:x=7,c=3,就在最后一行之前:x=8,x=2
#3:条目:x=8,c=2,就在最后一行之前:x=9,x=1
#4: entry: x=9, c=1, just before line 3: x=9, x=0 (returns at line 3, return 1;)

使用 return 1 不会进行进一步的递归调用。现在我们通过递归向后返回:

#3: x=9 => 返回 1*9; (计算结果为 9)
#2: x=9 => 返回 9*9; (计算结果为 81)
#1: x=9 => 返回 81*9; (计算结果为 729)
#0: x=9 => 返回 729*9; (计算结果为 6561)

现在为什么在所有四个递归级别中 x=9?因为它是作为引用而不是值传递的。这意味着对于所有对 f() 的递归调用,x 在内存中基本上是相同的变量(实际上所有 x 都是 p 的别名)。不仅在从第一个递归级别返回之前 x=9,在 f() 返回之后 p 也将是 9。

虽然您为两个参数都传递了 p,但 x 在所有递归级别上都是相同的,而 x 不是(按值传递)。这应该可以解释差异。

如果您还不理解这一点,您应该阅读引用资料。如前所述,这个函数对于学习引用来说是一个相当复杂的函数,它似乎不是很有用。

关于c++ - 为什么此代码返回 6561?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21818853/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com