我是一位在线朋友告诉我这应该有用(不应该崩溃),但他还没有给我任何实际建议如何解决这个问题。 抱歉,如果这个问题过于简单,我还是个初学者!
#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;
}
答案 0 :(得分:10)
编译所有警告和调试信息(例如g++ -Wall -Wextra -g
与GCC),改进代码以获取警告,然后逐步运行程序 在调试器中(例如gdb
)。
您将发现 - 使用调试器 - 您有无限递归,因为f(n)
正在调用f(n)
。
编码递归函数时,请注意过度call stack深度。根据经验,每个单独的调用帧应小于一千字节,并且整个调用堆栈限制为大约一兆字节(或几个)。详细信息是特定于实现和操作系统。
还要注意,某些optimizing compilers(包括使用g++
或更好的方式调用时的最新-O2
)能够将某些 tail calls优化为迭代代码。