递归函数在C++崩溃
Recursive function crash in C++
一位在线朋友告诉我,这应该可以工作(不应该崩溃),但他没有给我任何实际的建议如何解决这个问题。 抱歉,如果这个问题过于简单,我仍然是初学者!
#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++
)能够将一些尾部调用优化为迭代代码。
相关文章:
- 当回溯以零开始时,如何调试崩溃
- 内联映射初始化的动态atexit析构函数崩溃
- 执行函数时导致崩溃的变量
- 程序崩溃并显示"std::out_of_range"错误
- CoInitialize()在单独的线程上崩溃而不返回
- 使用调试/崩溃报告将应用程序部署到客户端
- 为什么所有C++编译器都会崩溃或挂起此代码
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 为什么我的多线程作业队列崩溃
- ExtractIconEx:可以工作,但偶尔会崩溃
- 为什么引用传递会导致此崩溃(C++)
- 试图创建流或fopen时程序崩溃
- 类对象数组的问题会导致崩溃
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- 为什么要增加导致崩溃的指针
- 在虚幻引擎中删除NXOpen对象时崩溃
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- Visual Studio在尝试读取resource.txt文件时崩溃
- 将方法转换为调用该方法的成员函子对象会导致崩溃