user3292653
user3292653

Reputation: 622

ES6 immediately invoke recursive arrow function

This is my current code:

const fn = parameter => {
    // if, else ...
    fn(X);
};
fn(0);

Now, I can't use this approach as I need to call the function with a parameter and it must be callable recursively.

How to refactor the above arrow function to be immediately invoked and recursively callable?

Upvotes: 13

Views: 5339

Answers (3)

Felix Kling
Felix Kling

Reputation: 816404

JavaScript provides a great solution for recursive functions: named function expressions. Hence I would recommend to use that instead of an arrow function:

(function fn(parameter) {
  // if, else ...
  fn(x);
})(0);

Upvotes: 19

Suren Srapyan
Suren Srapyan

Reputation: 68645

If you want to call recursive an lambda expression or anonymous function you need Y combinator. For more details you can read http://mvanier.livejournal.com/2897.html

For factorial it is like

var Y = (proc) => {
  return ((x) => {
    return proc((y) => { return (x(x))(y);});
  })((x) => {
    return proc((y) => { return (x(x))(y);});
  });
};

var factorial = (fact) => {
 return (n) => {
  return (n === 0) ? 1 : n * fact(n-1);
 };
};


console.log( Y(factorial)(5) );

For you code it will be like

const fn = (func)=> {

    return (parameter) => {
       // if else
       func(X);
    }
};

Y(fn)(0);

Upvotes: 3

Reza
Reza

Reputation: 867

First, let me put the disclaimer that Immediately-Invoked-Function-Expressions (IIFE) are considered bad practice in ES6, and this is tail-recursion and personally I would change it to a for loop.

but you can always do this I guess:

((x) =>{ const fn=(p)=>{
       //whatever
       fn(q)
   }
   fn(x)
})(0)

Upvotes: 12

Related Questions