Skip to Main Content

Java Programming

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Interested in getting your voice heard by members of the Developer Marketing team at Oracle? Check out this post for AppDev or this post for AI focus group information.

Recursive: The problem with anonymous lambda based functions

eudriscabrera-JavaNetAug 25 2016 — edited Sep 2 2016

I was practicing an algorithmic concept called Recursion. At first, I write a recursive method for calculating Factorial.

A simple solution:

import java.util.Scanner;

public class RecursionFactorial {

    public static void main(String[] args) {

    try (Scanner in = new Scanner(System.in)) {

        int n = in.nextInt();

       

        if(n >=2 && n <=20){

       

         System.out.println(factorial(n));

        }       

    }

    }

       

    public static int factorial(int n){

   

    if(n == 1){

        return 1;

    }else {

        return n * factorial(n-1);

    }   

    }

}

The above code satisfied the requirements, but I try to do the same using anonymous lambda based functions and the problem began.

import java.util.Scanner;

import java.util.function.Function;

public class RecursionFactorialJava8 {

      

    public static void main(String[] args) {

    try (Scanner in = new Scanner(System.in)) {

        int n = in.nextInt();

        Function<Integer, Integer> factorial = x -> x==1? x : x * factorial.apply(x - 1);

         if (n >= 2 && n <= 20) {

        System.out.println(factorial.apply(n));

        }

    }

    }

}

However, this will not work and will produce a compiler error:

The local variable factorial may not have been initialized

Lambdas are most often used to define anonymous functions. A recursive function must call itself. An anonymous lambda can’t call itself since it has no name, so it can’t be recursive.

The problem above is that we are referencing a variable while initializing it. So it is not yet initialized.

After spending a lot time trying to resolve the above error, I found the solution here. https://pysaumont.github.io/2014/09/01/Recursive-lambdas-in-Java-8.html.

import java.util.Scanner;

import java.util.function.Function;

public class RecursionFactorialJava8 {

   

   static final Function<Integer, Integer> factorial = x -> x==1? x : x * RecursionFactorialJava8.factorial.apply(x - 1);

   

    public static void main(String[] args) {

    try (Scanner in = new Scanner(System.in)) {

        int n = in.nextInt();

        if (n >= 2 && n <= 20) {

        System.out.println(factorial.apply(n));

        }

    }

    }

}

I just want to let you know about some problems with recursive and Lambdas in Java 8

Comments
Post Details
Added on Aug 25 2016
4 comments
3,136 views