私は10000桁の数値を格納するために何か必要なので、プロジェクトのユーラー問題を解決しようとしています。私はBigIntegerクラスを使用しています。JavaでBigIntegerを使用する再帰的なフィボナッチ
だから私はのBigIntegerを使用して、いくつかの再帰的フィボナッチ数列に働いていると私は、このコードを変換しようとしている:
public int fibonacci(int n) {
if (n == 0)
return 0;
else if (n == 1)
return 1;
else
return fibonacci(n - 1) + fibonacci(n - 2);
}
このリンクから:Java recursive Fibonacci sequence
同じコードに、しかしのBigIntegerを使用して。
だから、これは私がこれまで持っているものです。
public static BigInteger fibonacci(BigInteger index) {
if (index.compareTo(BigInteger.ZERO) == 0)
return BigInteger.ZERO;
else if (index.compareTo(BigInteger.valueOf(1)) == 1)
return BigInteger.ONE;
else
return fibonacci(index.subtract(BigInteger.ONE)).add(fibonacci(index.subtract(BigInteger.valueOf(2))));
}
public static int numberOfDigits(BigInteger fibonacci) {
return Integer.valueOf(fibonacci.toString().length());
}
public static void main(String[] args) {
long startTime = System.nanoTime();
for (BigInteger i = new BigInteger("1"); numberOfDigits(fibonacci(i)) <= 1000; i = i.add(BigInteger.ONE))
System.out.println(" " + i + " - " + fibonacci(i) + " - " + numberOfDigits(fibonacci(i)));
long endTime = System.nanoTime();
long duration = (endTime - startTime);
System.out.println("Duration: " + duration/1000000 + " ms");
}
私はそれを実行すると、私はこのように、StackOverFlowError
を得る:
Exception in thread "main" java.lang.StackOverflowError
at java.math.BigInteger.subtract(BigInteger.java:1423)
at Problem25Part2.fibonacci(Problem25Part2.java:19)
at Problem25Part2.fibonacci(Problem25Part2.java:19)
at Problem25Part2.fibonacci(Problem25Part2.java:19)
at Problem25Part2.fibonacci(Problem25Part2.java:19)
そして、それは私が1000倍を考えて繰り返されます。 何が間違っているのかわからないので、皆さんは私を助けてくれますか?ありがとうございました!
プログラムを非再帰形式に変換するだけです。 DPを使用すると、このプログラムはさらに高速になります。再帰は、既に 'StackOverflowError'が示すように、ここに行く方法ではありません。 – Paul
あなたはプロジェクトのオイラー問題を解決するために強引な力を使うべきではありません。 BigIntegersを使う理由この問題のポイントは大きな数字ではなく、計算時間を許容する方法を見つけることです。計算の数を制限する効果的な方法についてもう少し考えてみてください。あなたは派手なクラスは必要ありません:) – Dese
ありがとう皆さん。再帰的思考は速かったが、私は今それを実行していると私はその方法が遅く参照してください。ありがとう! –