Computing Fibonacci via RecursiveAction

Commonly denoted as Fn, the Fibonacci numbers are a sequence that respects the following formula:

F0=0, F1 = 1, ... Fn = Fn-1 + Fn-2 (n > 1)

A snapshot of Fibonacci numbers is:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...

The implementation of Fibonacci numbers via RecursiveAction can be accomplished as follows:

public class FibonacciRecursiveAction extends RecursiveAction {

private static final Logger logger =
Logger.getLogger(FibonacciRecursiveAction.class.getName());
private static final long THRESHOLD = 5;

private long nr;

public FibonacciRecursiveAction(long nr) {
this.nr = nr;
}

@Override
protected void compute() {

final long n = nr;

if (n <= THRESHOLD) {
nr = fibonacci(n);
} else {
nr = ForkJoinTask.invokeAll(createSubtasks(n))
.stream()
.mapToLong(x -> x.fibonacciNumber())
.sum();
}
}

private List<FibonacciRecursiveAction> createSubtasks(long n) {

List<FibonacciRecursiveAction> subtasks = new ArrayList<>();

FibonacciRecursiveAction fibonacciMinusOne
= new FibonacciRecursiveAction(n - 1);
FibonacciRecursiveAction fibonacciMinusTwo
= new FibonacciRecursiveAction(n - 2);

subtasks.add(fibonacciMinusOne);
subtasks.add(fibonacciMinusTwo);

return subtasks;
}

private long fibonacci(long n) {
logger.info(() -> "Number: " + n
+ " Thread: " + Thread.currentThread().getName());

if (n <= 1) {
return n;
}

return fibonacci(n - 1) + fibonacci(n - 2);
}

public long fibonacciNumber() {
return nr;
}
}

In order to test it, we need the following ForkJoinPool object:

ForkJoinPool forkJoinPool = ForkJoinPool.commonPool();

FibonacciRecursiveAction fibonacciRecursiveAction
= new FibonacciRecursiveAction(12);
forkJoinPool.invoke(fibonacciRecursiveAction);

logger.info(() -> "Fibonacci: "
+ fibonacciRecursiveAction.fibonacciNumber());

The output for F12 is as follows:

[15:40:46] Number: 5 Thread: ForkJoinPool.commonPool-worker-3
[15:40:46] Number: 5 Thread: ForkJoinPool.commonPool-worker-13
[15:40:46] Number: 4 Thread: ForkJoinPool.commonPool-worker-3
[15:40:46] Number: 4 Thread: ForkJoinPool.commonPool-worker-9
...
[15:40:49] Number: 0 Thread: ForkJoinPool.commonPool-worker-7
[15:40:49] Fibonacci: 144
..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset
3.17.174.0