javalambdafunctional-programmingjava-8java-stream

Java 8 Lambda expressions for solving fibonacci (non recursive way)


I am a beginner in using Lambda expression feature in Java 8. Lambda expressions are pretty well useful in solving programs like Prime number check, factorial etc.

However can they be utilized effectively in solving problems like Fibonacci where the current value depends on sum of previous two values. I have pretty well solved prime number check problem effectively using Lambda expressions. The code for the same is given below.

boolean checkPrime=n>1 && LongStream.range(2, (long) Math.sqrt(n)).parallel().noneMatch(e->(n)%e==0);

In the above code in the noneMatch method we are evaluating with the current value(e) in the range. But for the Fibonacci problem, we requires previous two values.

How can we make it happen?


Solution

  • The simplest solution is to use a stream of Pairs:

    Stream.iterate(new long[] { 1, 1 }, p -> new long[] { p[1], p[0] + p[1] })
          .limit(92)
          .forEach(p -> System.out.println(p[0]));
    

    Due to the lack of a standard pair type, it uses a two-element array. Further, I use .limit(92) as we can't evaluate more elements using long values. But it's easy to adapt to BigInteger:

    Stream.iterate(new BigInteger[] { BigInteger.ONE, BigInteger.ONE },
                   p -> new BigInteger[] { p[1], p[0].add(p[1]) })
          .forEach(p -> System.out.println(p[0]));
    

    That'll run until you haven't enough memory to represent the next value.

    By the way, to get the nth element from the stream:

    Stream.iterate(new long[] { 1, 1 }, p -> new long[] { p[1], p[0] + p[1] })
          .limit(91)
          .skip(90)
          .findFirst()
          .get()[1];