递归函数在C++崩溃

Recursive function crash in C++

本文关键字:崩溃 C++ 递归函数      更新时间:2023-10-16

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

#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;
}

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

使用调试器时,您会发现您有一个无限递归,因为f(n)正在调用f(n)

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

另请注意,某些优化编译器(包括最近使用-O2或更高版本调用时g++)能够将一些尾部调用优化为迭代代码。