递归的最大深度是多少?
What's the maximum depth of recursion?
我想知道递归函数的最大深度是多少。我知道它与堆栈大小有关。但是这是什么关系呢?如果我在 32 位机器中编写一个函数,它只调用自己,最大深度是多少?
unsigned long times=0;
void fun()
{
++times;
fun();
}
那么当堆栈溢出时,"时间"的价值是什么?
关系大致如下:
最大递归深度 = ((堆栈大小)-(调用链中堆栈帧的总大小直至递归函数))/(递归函数的堆栈帧大小)
堆栈帧是每次进行函数调用时推送到堆栈上的数据。它由函数返回地址、参数空间(未在寄存器中传递)和局部变量空间组成。对于不同的函数,它会有所不同,但对于在每次调用时递归调用自身的给定函数,它将是恒定的。
由此可见,具有大量参数和/或大量局部变量的递归函数将具有较大的堆栈帧大小,因此对于给定大小的堆栈,最大递归深度较小。
如果编译器执行尾递归优化,则在顶级调用后堆栈帧大小实际上为零,因此公式给出除以零:没有最大递归深度。
我在这里所说的一切可能有多个规则例外,但这是基本关系。
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 复制列表初始化的隐式转换的等级是多少
- while循环中while循环的时间复杂度是多少
- OpenGL在启用深度测试时不会丢弃我的碎片
- 如何检查一个c++字符串中有多少相同的字符/数字
- C++有多少类型的循环
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- 在条件变量中触发错误信号的频率是多少
- 函数的时间复杂度是多少?
- C++尝试深度复制唯一指针时出现内存访问冲突
- 必须为 C++20 协程帧保留多少内存?
- 对于四轴飞行器,PID中I控制器的理想值应该是多少
- C++,数组有多少个地址?
- 在C++中使用并行化的预期速度是多少(不是 OpenMp,而是 <thread>)
- 在 Linux 中存储区域设置名称的缓冲区大小应该是多少?
- 在内存不足之前,我可以声明多少个 const 变量?
- 可以读入进程内存的最大块大小是多少?
- 如何在不知道C++中有多少可选参数的情况下在循环中使用va_arg?
- 在二维向量或数组中可以存储的最大元素数是多少?
- 递归的最大深度是多少?