分段故障中的大规模递归函数

Segmentation fault in a massively recursive function

本文关键字:大规模 递归函数 故障 分段      更新时间:2023-10-16

我有一个函数,它调用自己几乎无限次,但它确实有一个结束。它计算数学公式(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 

再试一次

我有一个函数,它调用自己几乎无限次,但它确实有一个结束。

是否有接近无限大的堆栈内存?

如果不是(很可能的情况),您将很快破坏您的堆栈。分割错误在这里是一个明显的标志。

我会完全避免递归。