使用递归斐波那契函数时发生堆栈溢出错误

时间:2012-02-14 11:41:13

标签: java stack-overflow

这是我的代码,它运行良好,值为400到4000,但一旦大约4mil,我就会出现堆栈溢出错误。

提前致谢!

public class Fib {
static int c=1,b=2;
static long sum1=0,sum2=0;

static long fib(long a){
if(a==1){
    return 1;
}
if(a==2){
    return 2;
}
else{
    return fib(a-1)+fib(a-2);
}

    }


    public static void main(String[] args){
sum2= fib(4000000);
    System.out.println("Sum %f" +sum2);
}
    }

3 个答案:

答案 0 :(得分:7)

是的 - 你的堆栈空间不足。它远非无限,你在每次递归调用时都会使用它。你试图最终得到一个拥有400万个堆栈帧的堆栈 - 这样做不会起作用。

我建议你考虑一种迭代方法。即使您拥有无限量的堆栈,该代码也可能无法在宇宙热死之前完成。 (想想这段代码的复杂性......)

答案 1 :(得分:4)

您可以增加Java程序的堆栈大小。例如:

java -Xss4m YourProgram

Reference

尽管如此,我还是会推荐一种迭代方法。

答案 2 :(得分:1)

正如Jon Skeet上面提到的,你的代码需要大量的时间来运行 - 2到400万,这在任何方面都是不实际的。坦率地说,我很惊讶堆栈干涸了,我认为代码会运行一段荒谬的时间。

您应该使用迭代方法。这是斐波那契序列的更好实现:

static long fib(long i){
    if ( i == 0 || i == 1 ) return 1;
    long a = 1; //This is the 0th element 
    long b = 1; //This is the 1st element
    while( i-- > 1 ){ //Each iteration, sets a and b to the next element in the fibonacci sequence
        long temp = b;
        a += b;
        b = a;
        a = temp;
    }
    return b;
}