分段故障中的大规模递归函数
Segmentation fault in a massively recursive function
我有一个函数,它调用自己几乎无限次,但它确实有一个结束。它计算数学公式(TeX):
当x<a
:
g_{a}(x)=1
x>=a
:
g_{a}(x)=g_{a}(x-1)+g_a(x-a)
下面是我的代码(c++):
#include <iostream>
#include <math.h>
#include <stdio.h>
#include <cmath>
using namespace std;
double g( double a, double x){
if (x>=a) return (g(a,x-1)+g(a,x-a));
else if (x<a) return 1;
return 0;
}
int main(){cout << g(sqrt(10000019),10000019);}
我用g(sqrt(10000019),10000019);
调用函数如何停止SEGFAULT?
我怀疑您的段错误是由于堆栈空间不足。
你可以限制/不限制堆栈空间的大小(至少在Linux上)使用tcsh的limit命令。
% limit
cputime unlimited
filesize unlimited
datasize unlimited
stacksize 10240 kbytes
coredumpsize 0 kbytes
memoryuse unlimited
vmemoryuse unlimited
descriptors 4096
memorylocked 64 kbytes
maxproc 1024
你可以不限制你的堆栈大小
% unlimit stacksize
% limit
cputime unlimited
filesize unlimited
datasize unlimited
stacksize unlimited
coredumpsize 0 kbytes
memoryuse unlimited
vmemoryuse unlimited
descriptors 4096
memorylocked 64 kbytes
maxproc 1024
再试一次
我有一个函数,它调用自己几乎无限次,但它确实有一个结束。
是否有接近无限大的堆栈内存?
如果不是(很可能的情况),您将很快破坏您的堆栈。分割错误在这里是一个明显的标志。
我会完全避免递归。
相关文章:
- 递归函数计算序列中的平方和(并输出过程)
- 如何在Elixir中调用递归函数并行
- 递归函数有效,但无法记忆
- 为什么我的递归函数按降序打印,然后按升序打印?
- 为什么递归函数的最终输出是 5?
- 有没有办法使用递归函数找到数组中最小值的 INDEX?C++
- 如何将记忆应用于此递归函数?
- 如何从递归函数中完全返回,该函数给出了每个函数结果的累积相加?
- 无穷大而循环时具有递归函数
- 即使没有调用这个递归函数,它是如何工作的?
- 如何使此递归函数从给定的起始位置返回最小的整数?
- 此递归函数的每次迭代的值存储在哪里?
- 可以清除递归函数中的变量吗?
- 如何在递归函数调用中返回当前函数值
- 递归函数 c++ 的复杂性
- 这个递归函数有什么作用?运行时的复杂性是多少?
- 任何人都可以查明我的递归函数中的错误吗?
- 递归函数的返回类型推导
- 递归函数调用在后台工作
- 分段故障中的大规模递归函数