C++中的递归函数崩溃

Whi*_* S. 1 c++ recursion function

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

Bas*_*tch 10

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

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

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

还要注意一些优化编译器(包括最近g++调用-O2或更好的编译器)能够将一些 尾调用优化为迭代代码.