2015-10-07 35 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);} 

我與g(sqrt(10000019),10000019);聯繫3210如何停止SEGFAULT?

+1

使用a和x的值是否會得到SEGFAULT? –

+0

而且,你不能發佈[MCVE](http://stackoverflow.com/help/mcve)嗎? –

+0

順便說一下,這是Ackermann_function,我正確嗎?如果是,那麼我懷疑你可以停止SEGFAULT。 – gjha

回答

2

我懷疑你的seg-fault沒有用完堆棧空間。

您可以使用tcsh中的limit命令限制/取消限制您的堆棧空間有多大(至少在Linux上) 。

% 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 

,並給它的另一個嘗試。

+0

在bash中,你會使用ulimit:請參閱http://ss64.com/bash/ulimit.html – rts1

+0

Windows cygwin? –

+2

當內存用完時它仍然會崩潰 - – antlersoft

1

我有一個函數可以調用自己接近無限的次數,但它確實有一個結束。

你有近乎無限量的堆棧內存嗎?

如果沒有(可能出現的情況),您將立即粉碎堆棧。分段故障在這裏是一個明確的標誌。

我會完全避免遞歸。

+0

如何將其轉換爲迭代呢? –

+0

@KaidenPrince:用你的手指......?我不明白你的問題。 –

+0

我真的不知道如何轉換它,否則我會。 –