簡體   English   中英

RecursiveAction 如何與斐波那契一起工作?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM