c++ - 使用递归时获取变量的奇怪值
问题描述
我编写了一个程序,使用递归函数打印前 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
推荐阅读
- json - jsonPath Expression for json 和 json 参数的 json 使用 NIFI 表达式语言
- yocto - 如何在图像配方中全局继承一个类 - yocto
- reactjs - React + Formik + Yup 异步验证
- windows-subsystem-for-linux - 在 WSL 中安装 pythonnet 或 pywin32
- reactjs - React 组件重新渲染
- javascript - Javascript日期,比较月份时要考虑什么?
- typescript - 如何在初始化之前设置对象的类型?
- r - 是否有一个函数可以生成自 r 中记录的第一个日期以来的天数序列?
- swift - 存储和加载 [Uint8] 到钥匙串(Swift)
- powershell - PSCustomObject 错误地格式化输出