演習課題「Fork/Joinフレームワークを使ってみよう」
現在、フィボナッチ数列のN項目の数を求めるコードが記述されており、それにFork/Joinフレームワークを実装しようとしています。コメント部分の下にコードを追記して、正しく動作するようにしてください。
期待する出力値
55
#12:Fork/Joinフレームワーク(Fork/Join Framework)
このチャプターでは、Fork/Joinフレームワークについて学習します。
フィボナッチ数列 (paizaランクB相当)
https://paiza.jp/works/mondai/dag_memoization_search/dag_memoization__problems_step0
新・Java入門編31: 抽象クラス(abstractクラス)
https://paiza.jp/works/java/new-primer/java-new-primer-31/94002
新・Java入門編31: 抽象メソッド(abstractメソッド)
https://paiza.jp/works/java/new-primer/java-new-primer-31/94003
クラスForkJoinPool
https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/util/concurrent/ForkJoinPool.html
クラスForkJoinTask
https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/util/concurrent/ForkJoinTask.html
クラスRecursiveTask
https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/util/concurrent/RecursiveTask.html
クラスRecursiveAction
https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/util/concurrent/RecursiveAction.html
import java.util.*;
import java.util.concurrent.*;
import java.util.concurrent.atomic.*;
public class Main {
private static int[] memo = new int[100001];
static class Fib extends RecursiveTask<Integer> {
private final int n;
public Fib(int n) {
this.n = n;
}
@Override
protected Integer compute() {
if (n == 0) {
memo[0] = 0;
return memo[0];
} else if (n == 1) {
memo[1] = 1;
return memo[1];
} else if (memo[n] != -1) {
return memo[n];
} else {
var task1 = new Fib(n - 1);
var task2 = new Fib(n - 2);
task1.fork();
var result2 = task2.compute();
var result1 = task1.join();
memo[n] = (result1 + result2) % 1000000007;
return memo[n];
}
}
}
public static void main(String[] args) {
var sc = new Scanner(System.in);
Arrays.fill(memo, -1);
var n = sc.nextInt();
var pool = new ForkJoinPool();
var task = new Fib(n);
var result = pool.invoke(task);
System.out.println(result);
}
}