2012-04-25 7 views
2

Javaスタックはどのように設定されていますか?フィボナッチの再帰呼び出しによるスタックオーバーフロー

大学では、再帰的方法で計算され、スタックによって処理される可能性のある最大のものを決定します。Fibonacci number

興味深いのは、と-XmsJVMのどれくらいの数字が問題ではないことがテストによって示されています。私はFib(4438)まで走ることができます。しかし、結果は一貫していません。いつかは4436に下がります。

スタックの形式はありますか?

-Xss 4096mでスタックが増加しても差はありません。

+1

スタックサイズの増加は、1MBのスタックサイズのために、このように、-Xssコマンドを使用して行われます。-Xss1m –

+1

お使いのホストコンピュータは、任意の特定の時点でメモリに多かれ少なかれプログラムを実行している可能性があります。あなたのプログラムで利用可能なメモリは常に一定であるとは思わないはずです。 – Tejs

+1

@Tejs:実際には、スタックサイズが一定であると思われます。これが他のプログラムのメモリ要件を妨げる場合は、そのページングを使用して必要なメモリを持つすべてのプログラムの錯覚を作成します。これまで私はOPの疑問を理解することができます。 –

答えて

3

-Xmxと-Xmsは、JVMのヒープのためのアクセス可能なメモリを設定し、あなたは-Xssオプションの助けを借りてこれを行う、スタックサイズを大きくする必要があります。

+1

Hmです。この引数を指定しないと、スタックサイズはどのように決定されますか? –

+1

デフォルト値が設定されています。オペレーティングシステムとJVMのバージョンとJVMの作成者(Oracle、IBMなど)によって異なりますが、256MBから2048MBに変更されます –

-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 

私はこのことができます願っています。

+2

これはOPの質問には答えません。これは、再帰をどのくらい深く行うことができるかということです。 – templatetypedef

+0

ちょうど参考になる、この章は、OPの質問のすべての答えです。これは単なるコードです。 – Vagelism

3

あなたは課題を誤解しました。スタックのサイズはほとんど問題になりません。問題は指数関数的です。そして、素朴な再帰的なプログラムでFib(4438)に行くことはできませんでした。 (50)次のコードを使用して、あなたがのFibにそれを作る場合、あなたは幸運だろう:

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)); 
} 
関連する問題