フィボナッチシリーズのいくつかのインデックスに基づいてスレッドを使用して再帰的に調べる必要があります。次のコードを試しましたが、プログラムは終了しません。私が何かを見逃している場合は、私に知らせてください。Java ExecutorServiceを再帰的フィボナッチシリーズ
コード:固定
import java.math.BigInteger;
import java.util.concurrent.*;
public class MultiThreadedFib {
private ExecutorService executorService;
public MultiThreadedFib(final int numberOfThreads) {
executorService = Executors.newFixedThreadPool(numberOfThreads);
}
public BigInteger getFibNumberAtIndex(final int index)
throws InterruptedException, ExecutionException {
Future<BigInteger> indexMinusOne = executorService.submit(
new Callable<BigInteger>() {
public BigInteger call()
throws InterruptedException, ExecutionException {
return getNumber(index - 1);
}
});
Future<BigInteger> indexMinusTwo = executorService.submit(
new Callable<BigInteger>() {
public BigInteger call()
throws InterruptedException, ExecutionException {
return getNumber(index - 2);
}
});
return indexMinusOne.get().add(indexMinusTwo.get());
}
public BigInteger getNumber(final int index)
throws InterruptedException, ExecutionException {
if (index == 0 || index == 1)
return BigInteger.valueOf(index);
return getFibNumberAtIndex(index - 1).add(getFibNumberAtIndex(index - 2));
}
}
その代わりに呼び出しメソッドからはgetNumber(int)を呼び出す(ドル紙幣のおかげで)
、私は動的プログラミングアルゴリズムを呼び出していますそのインデックスの数値を計算します。
そのためのコードは次のとおりです。
public class DynamicFib implements IFib {
private Map<Integer, BigInteger> memoize = new HashMap<Integer, BigInteger>();
public DynamicFib() {
memoize.put(0, BigInteger.ZERO);
memoize.put(1, BigInteger.ONE);
}
public BigInteger getFibNumberAtIndex(final int index) {
if (!memoize.containsKey(index))
memoize.put(index, getFibNumberAtIndex(index - 1).add(getFibNumberAtIndex(index - 2)));
return memoize.get(index);
}
}
これは機能しました!ありがとう! :) – Shankar
しかし、まだ再帰的なマルチスレッドの手順は、再帰的な非マルチスレッドのメモ帳よりずっと長い時間がかかります。 – Shankar
繰り返し回数が指数関数的に増加するため、単純な再帰は決して終了しません(マルチスレッドの場合もあります)。 –