gpt4 book ai didi

c++ - 使用递归获取变量的奇怪值

转载 作者:行者123 更新时间:2023-11-27 22:36:56 24 4
gpt4 key购买 nike

我编写了一个程序,使用递归函数打印前 25 个自然数的总和。一切顺利,我也得到了正确的输出(即 325)。之后我试了一下我的代码,看看会发生什么。

代码如下:

int su(int sum,int i)
{
if(i<26)
{
sum=sum+i+su(sum,i+1);
cout << sum << endl; // I added this line to see what happens.
// This line wasn't needed but I still
// added it.
}
else
return sum;
}

当我运行这段代码时,它打印了变量 sum 的奇怪值.这是输出的屏幕截图:output前 25 个自然数的总和是 325,但它甚至没有出现在输出的任何地方。相反,我在输出中得到了不同的数字。但是,当我删除 cout << sum << endl; 行时来自 if语句,我得到了预期的总和(即 325)。
这是什么原因?

最佳答案

i 小于 26 时,您的非 void 函数不会返回任何内容,这是未定义的行为。如果您检查/打开编译器警告,您将看到警告:

warning: control reaches end of non-void function [-Wreturn-type]
}
^

删除已经毫无意义的 else 解决了这个问题:

#include <iostream>
using namespace std;

int su(int sum,int i)
{
if(i<26)
{
sum=sum+i+su(sum,i+1);
cout<<sum<<endl;
}
// Removed the else. Always returns something
return sum;
}

int main() {
std::cout << su(0, 0) <<std::endl;
}

输出:

25
49
72
94
115
135
154
172
189
205
220
234
247
259
270
280
289
297
304
310
315
319
322
324
325
325
325

始终首先确保您的递归函数最终跳出循环并返回一个值,以防它不是void。一个更简单、更清晰的方法是这样的(有点像经典的阶乘函数):

#include <iostream>

int sum (int i) {
if(i == 1) {
return 1;
}
return i + sum(i-1);
}

int main() {
std::cout << sum(25) <<std::endl;
}

输出:

325

如果您添加 std::cout 以查看引擎盖下发生了什么:

#include <iostream>

int sum (int i) {
std::cout << i << std::endl; // current integer
if(i == 1) {
return 1;
}
return i + sum(i-1);
}

int main() {
std::cout << sum(25) <<std::endl;
}

输出符合预期:

25
24
23
22
21
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
325

关于c++ - 使用递归获取变量的奇怪值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53047652/

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