freeCodeCamp/curriculum/challenges/english/08-coding-interview-prep/rosetta-code/y-combinator.english.md

2.8 KiB

title id challengeType
Y combinator 594810f028c0303b75339ad5 5

Description

In strict functional programming and the lambda calculus, functions (lambda expressions) don't have state and are only allowed to refer to arguments of enclosing functions. This rules out the usual definition of a recursive function wherein a function is associated with the state of a variable and this variable's state is used in the body of the function. The Y combinator is itself a stateless function that, when applied to another stateless function, returns a recursive version of the function. The Y combinator is the simplest of the class of such functions, called fixed-point combinators.

Instructions

Define the stateless Y combinator function and use it to compute factorial. The factorial(N) function is already given to you. See also:

Tests

tests:
  - text: Y must return a function
    testString: assert.equal(typeof Y(f => n => n), 'function', 'Y must return a function');
  - text: factorial(1) must return 1.
    testString: assert.equal(factorial(1), 1, 'factorial(1) must return 1.');
  - text: factorial(2) must return 2.
    testString: assert.equal(factorial(2), 2, 'factorial(2) must return 2.');
  - text: factorial(3) must return 6.
    testString: assert.equal(factorial(3), 6, 'factorial(3) must return 6.');
  - text: factorial(4) must return 24.
    testString: assert.equal(factorial(4), 24, 'factorial(4) must return 24.');
  - text: factorial(10) must return 3628800.
    testString: assert.equal(factorial(10), 3628800, 'factorial(10) must return 3628800.');

Challenge Seed

function Y(f) {
  return function() {
  // Good luck!
  };
}

var factorial = Y(function(f) {
  return function (n) {
    return n > 1 ? n * f(n - 1) : 1;
  };
});

After Test

var factorial = Y(f => n => (n > 1 ? n * f(n - 1) : 1));

Solution

var Y = f => (x => x(x))(y => f(x => y(y)(x)));