这是我的代码,它运行良好,值为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);
}
}
答案 0 :(得分:7)
是的 - 你的堆栈空间不足。它远非无限,你在每次递归调用时都会使用它。你试图最终得到一个拥有400万个堆栈帧的堆栈 - 这样做不会起作用。
我建议你考虑一种迭代方法。即使您拥有无限量的堆栈,该代码也可能无法在宇宙热死之前完成。 (想想这段代码的复杂性......)
答案 1 :(得分:4)
答案 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;
}