使用递归时获取变量的奇怪值
Getting weird values of a variable while using recursion
我写了一个程序,用递归函数打印前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
关键字,它应该可以工作。
相关文章:
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- 使用递归时获取变量的奇怪值
- 从 C 中的变量获取文件的路径,C++
- 我可以从其变量中获取对类对象的引用吗?
- 为什么在分配给成员变量之前获取unique_ptr的返回是一个问题?
- std::cin 从控制台获取两种不同的变量类型,'storing'以后使用第二种类型?
- 如何使用可变参数模板获取参数的变量号及其大小C++
- 获取具有静态局部变量的绑定/推断捕获 lambda 的函数指针
- constexpr 函数在编译时获取值,即使我的变量不是 constexpr
- 如何在不为其声明变量的情况下获取和使用常量值的地址?
- 附加调试器并以编程方式获取变量地址 Visual Studio
- 是否可以将变体的索引作为 constexpr 变量获取?
- 为什么我无法获取 MSVS2019 / C++ 中字符或uint8_t变量的内存地址?
- 我正在尝试获取类私有成员中变量的输入
- C++/Win32 构造函数不使用从对话框获取的字符串初始化变量
- 使用基地址和偏移量获取变量的地址
- C++11 - 获取编译时的所有类变量,并在没有 Boost 的情况下为它们调用方法
- 使用 WindowSetup 类变量获取错误
- fstream 变量获取文本文件中的所有行
- 从类型而不是从变量获取指针级别