2015-10-07 2 views
2

У меня есть функция, которая называет себя почти бесконечным количеством раз, но у нее есть конец. Он вычисляет математическую формулу (в текс):Ошибка сегментации в рекурсивной функции

Когда 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);} 

I вызовите функцию с помощью g(sqrt(10000019),10000019); Как остановить SEGFAULT?

+1

С какими значениями a и x вы получаете SEGFAULT? –

+0

А также, не можете ли вы опубликовать [MCVE] (http://stackoverflow.com/help/mcve)? –

+0

BTW это Ackermann_function, я прав? если да, то я сомневаюсь, что вы можете остановить SEGFAULT. – gjha

ответ

2

Я подозреваю, что ваш seg-fault был из-за бега из стекового пространства.

Вы можете ограничить/ограничить, насколько велик объем вашего стека (по крайней мере на Linux) с использованием команды limit из tcsh.

% limit 
cputime  unlimited 
filesize  unlimited 
datasize  unlimited 
stacksize 10240 kbytes 
coredumpsize 0 kbytes 
memoryuse unlimited 
vmemoryuse unlimited 
descriptors 4096 
memorylocked 64 kbytes 
maxproc  1024 

Вы можете ваш STACKSIZE снятия ограничения

% 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 

И дать ему еще одну попытку.

+0

В bash вы можете использовать ulimit: см. Http://ss64.com/bash/ulimit.html – rts1

+0

Windows cygwin? –

+2

Он по-прежнему падает, когда заканчивается память. – antlersoft

1

У меня есть функция, которая называет себя почти бесконечным количеством раз, но у нее есть конец.

У вас есть бесконечное количество памяти стека?

Если нет (вероятный сценарий), вы мгновенно уничтожаете свой стек. Отказ сегментации является явным признаком этого.

Я бы полностью избежал рекурсии.

+0

Как бы преобразовать это в итерацию? –

+0

@ KaidenPrince: С пальцами ...? Я не понимаю ваш вопрос. –

+0

Я не знаю, как его преобразовать, иначе я бы хотел. –

Смежные вопросы