使用递归时获取变量的奇怪值

Getting weird values of a variable while using recursion

本文关键字:变量 获取 递归      更新时间:2023-10-16

我写了一个程序,用递归函数打印前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的奇怪值。这是一个屏幕截图输出:输出前25个自然数的总和是325,但这甚至没有出现在输出的任何地方。相反,我在输出中得到了不同的数字。然而,当我从if语句中删除行cout << sum << endl;时,我得到了预期的和(即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

如果不是在递归结束时,函数不会返回任何内容。删除else关键字,它应该可以工作。