[英]How does RecursiveAction work with Fibonacci?
在斐波那契的情況下遞歸如何工作。 下面的示例使用不返回任何值的 RecursiveAction。 但是仍然可以計算斐波那契數。 我的意思是例如在斐波那契(15)的情況下。 下例中的閾值為 10。因此無法直接計算 Fibonacci(15)。 因此將創建另外 2 個任務。 ForkJoinFibonacci(n - 1) 和 ForkJoinFibonacci(n - 2)。 所以在下面的例子中,只有成員變量“number”存儲了計算出的斐波那契數。 但它永遠不會被退回。 只存儲在每個 ForkJoinFibonacci class 的本地。那么如何將所有計算的數字相加呢?
public class ForkJoinFibonacci extends RecursiveAction {
private static final long threshold = 10;
private volatile long number;
public ForkJoinFibonacci(long number) {
this.number = number;
}
public long getNumber() {
return number;
}
@Override
protected void compute() {
long n = number;
if (n <= threshold) {
number = fib(n);
} else {
ForkJoinFibonacci f1 = new ForkJoinFibonacci(n - 1);
ForkJoinFibonacci f2 = new ForkJoinFibonacci(n - 2);
ForkJoinTask.invokeAll(f1, f2);
number = f1.number + f2.number;
}
}
private static long fib(long n) {
if (n <= 1) return n;
else return fib(n - 1) + fib(n - 2);
}
}
說清楚。 有用。 但我只是不知道它為什么起作用。
求和是在計算方法中。
每個遞歸操作都以數字形式存儲自己的計算。 如果計算方法足夠小,則計算方法要么完成計算,將其存儲在數字字段中,要么將工作分配給另外兩個遞歸操作,在這種情況下,它從它們的數字字段中獲取結果,對它們求和,並將它們存儲在它的自己的號碼字段。 最頂層的遞歸操作通過 getter 公開數字。
另一種編寫方法是將 invokeAll 替換為
f1.fork();
f2.compute();
f1.join();
這樣,當前線程忙於計算,而不是引入另一個線程並等待它完成工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.