首页 > 解决方案 > 使用递归时获取变量的奇怪值

问题描述

我编写了一个程序,使用递归函数打印前 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)。
这是什么原因?

标签: c++functionrecursion

解决方案


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

推荐阅读