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

C++ 使用递归时获取变量的奇怪值,c++,function,recursion,C++,Function,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.

我编写了一个程序,使用递归函数打印前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;
}
intsu(intsum,inti)
{

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

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

如果
i
小于26,这是未定义的行为。如果您选中/打开编译器警告,您将看到警告:

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;
}
始终首先确保递归函数最终退出循环并返回值,以防它不是
void

如果您添加
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;
}

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;
}
始终首先确保递归函数最终退出循环并返回值,以防它不是
void

如果您添加
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;
}


如果返回类型不是“代码”>空> <代码>,必须返回某个函数(除了<代码>主< /代码>)。当代码< >爱上编译警告时,您不会返回,并且永远不会忽略编译器!此代码具有未定义的行为,编译器会警告您。我一直认为C++警告/错误被严重地命名,我个人阅读。“警告”为“错误”而“错误”为“致命错误”您好@SergeyA,谢谢您的回复。我没有收到任何警告。@mujtaba1747“我没有收到任何警告”。您启用了它们吗?如果函数的返回类型不是
void
(除了
main
),则必须从函数返回某些内容当代码< >我喜欢编译警告,并且永远不忽略它们!这个代码有未定义的行为,编译器会警告你。我一直认为C++警告/错误被严重地命名,我个人把“警告”作为“错误”和“错误”读为“致命错误”。“你好@SergeyA,谢谢你的回复。我没有收到任何警告。@mujtaba1747“我没有收到任何警告。”你启用了它们吗?遗憾的是,它会返回一些东西-因为它必须返回。问题是编译器没有被告知返回什么,所以它只返回你希望是垃圾的东西。我知道,我的意思是“不返回任何东西”“不可用的东西”。(在递归函数中我忘记了返回多少次?显然太多了)@UKMonkey它是UB,所以它不必返回任何东西。例如,如果编译器能够证明它始终是UB,那么函数调用可能会被省略。或者它可能只是在函数结束时崩溃。虽然在这种情况下,函数肯定会返回一些东西。最有可能的是,用户最终会得到累加器中的任何东西或者当函数返回时,因此“它将返回某些内容”“这是一个公平的说法。程序可能看起来运行正常。但是,理论上代码可以做任何事情,也可以不做任何事情。它会返回一些东西——因为它必须返回。问题是编译器没有被告知返回什么,所以它只返回你希望是垃圾的东西。我知道,我的意思是“不返回任何东西”“不可用的东西”。(在递归函数中我忘记了返回多少次?显然太多了)@UKMonkey它是UB,所以它不必返回任何东西。例如,如果编译器能够证明它始终是UB,那么函数调用可能会被省略。或者它可能只是在函数结束时崩溃。虽然在这种情况下,函数肯定会返回一些东西。最有可能的是,用户最终会得到累加器中的任何东西或者当函数返回时,因此“它将返回某些内容”"这是一个公平的说法。该程序可能看起来运行正常。但从理论上讲,该代码可以做任何事情,或者什么都不需要回答。但是,我无法理解变量“sum”后面的模式,即:254972941151351541721920522023424725927028028929730431531932192324325325 325现在它更多的是一个数学上的疑问,但如果你也能帮我的话,那就太好了!!0+25=25;0+25+24=49;0+25+24+23=72;0+25+24+23+22=94等等。这仅仅是递归,没有别的。只要做更多关于递归的练习来掌握它的诀窍就好了。谢谢,你那边对fr有什么建议吗om我在哪里可以练习递归问题并了解更多关于这个概念的知识呢?非常感谢你的回答。但是我无法理解变量“sum”后面的模式,即:254972941151541721282052202342472592702802972973043131932129324325325现在它更多的是一个数学上的疑问,但我仍然不明白如果你也能帮我,那就太好了!!0+25=25;0+25+24=49;0+25+24+23=72;0+25+24+23+22=94等等。这只是递归,没有别的。只要多做一些递归练习就可以掌握它的诀窍。谢谢,你那边有什么建议,我可以从哪里练习递归和学习更多关于这个概念的信息?
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