c++ - C++中的递归函数崩溃

标签 c++ function recursion

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

#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 -gGCC ),改进你的代码以获得没有警告,然后运行你的程序在调试器中逐步(例如gdb)。

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

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

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

关于c++ - C++中的递归函数崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47434096/

相关文章:

ios - 用函数修改多张图片

c++ - 堆栈展开在调用函数和被调用函数之间究竟是如何工作的

Powershell,查看(循环)所有驱动器

matlab - 使用递归 MATLAB 函数还是优化?

c++ - 为什么我不能输出迷宫的路径?谁能告诉我?拜托

c++ - __func__ 和 __PRETTY_FUNCTION__ 之间的东西?

C++ 数据库连接?

c++ - 将递增/递减运算符传递给函数

c - 我的 C 语法的左递归错误

c++ - 使用 Boost Karma 替换 std::stringstream 进行 double 到 std::string 的转换