使用Fibonacci的递归调用堆栈溢出

时间:2012-04-25 17:54:52

标签: java stack fibonacci

如何设置Java堆栈?

对于大学,我将确定通过递归方法计算的最大可能Fibonacci number是什么,并且可以由堆栈处理。

有趣的是:测试表明,JVM有多少-Xmx-Xms并不重要。我能够跑到Fib(4438)。但结果并不一致。有时它会下降到4436。

堆栈是否有公式?

通过-Xss 4096m增加堆栈并没有什么不同。

3 个答案:

答案 0 :(得分:3)

-Xmx和-Xms设置JVM 可访问的内存,需要增加堆栈大小,在-Xss选项的帮助下执行此操作。

答案 1 :(得分:3)

你误解了作业。堆栈大小非常重要。问题是指数级的。并且您不可能通过天真的递归程序获得Fib(4438)。使用下面的代码,如果你使用Fib(50),你会很幸运:

public static BigInteger f(int n) {
    if (n == 0) 
        return BigInteger.ZERO; 
    if (n == 1) 
        return BigInteger.ONE; 
    return f(n-1).add(f(n-2));
}

答案 2 :(得分:-2)

Java. How to program, 9th edition, Deitel and Deitel,第771页:

 // Fig. 18.5: FibonacciCalculator.java
 // Recursive Fibonacci method.
 import java.math.BigInteger;
 public class FibonacciCalculator
 {
     private static BigInteger TWO = BigInteger.valueOf( 2 );


     // Recursive declaration of method fibonacci
     public static BigInteger fibonacci( BigInteger number )
     {
         if ( number.equals( BigInteger.ZERO ) ||
              number.equals( BigInteger.ONE ) ) // Base cases
             return number;
         else // Recursion step
             return fibonacci( number.subtract( BigInteger.ONE ) ).add(
         fibonacci( number.subtract( TWO ) ) );
     } // end method fibonacci


     // Displays the Fibonacci values from 0-40
     public static void main( String[] args )
     {
         for ( int counter = 0; counter <= 40; counter++ )
             System.out.printf( "Fibonacci of %d is: %d\n", counter,
         fibonacci( BigInteger.valueOf(counter)));
     } // End main()

 } // end class FibonacciCalculator

我希望这会有所帮助。