我需要根據Fibonacci Series中的一些索引來遞歸地使用線程找出數字,並且我嘗試了下面的代碼,但程序永遠不會結束。請讓我知道如果我失去了一些東西。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
但仍然遞歸多線程過程比memoized遞歸非多線程一個..任何提示,以提高性能? – Shankar
好吧,這就是要點 - 簡單的遞歸永遠不會結束(甚至是多線程的),因爲迭代的次數會成倍增長 –