C ++中的递归函数崩溃

时间:2017-11-22 11:54:38

标签: c++ function recursion

我是一位在线朋友告诉我这应该有用(不应该崩溃),但他还没有给我任何实际建议如何解决这个问题。 抱歉,如果这个问题过于简单,我还是个初学者!

#include<iostream>
using namespace std;

int f(int n)
{
if((n-1)==1) return 1;
else return 2*f(n)-n;
}

int main()
{
cout<<f(1)<<endl;
cout<<f(1)<<endl;
cout<<f(0)<<endl;
cout<<f(-3)<<endl;
cout<<f(-10)<<endl;
return 0;
}

1 个答案:

答案 0 :(得分:10)

编译所有警告和调试信息(例如g++ -Wall -Wextra -gGCC),改进代码以获取警告,然后逐步运行程序 在调试器中(例如gdb)。

您将发现 - 使用调试器 - 您有无限递归,因为f(n)正在调用f(n)

编码递归函数时,请注意过度call stack深度。根据经验,每个单独的调用帧应小于一千字节,并且整个调用堆栈限制为大约一兆字节(或几个)。详细信息是特定于实现和操作系统。

还要注意,某些optimizing compilers(包括使用g++或更好的方式调用时的最新-O2)能够将某些 tail calls优化为迭代代码。