Skip to content

Instantly share code, notes, and snippets.

@drewsynan
Created March 18, 2016 15:36
Show Gist options
  • Select an option

  • Save drewsynan/eeabc7f71b5d049df7f3 to your computer and use it in GitHub Desktop.

Select an option

Save drewsynan/eeabc7f71b5d049df7f3 to your computer and use it in GitHub Desktop.
// step 1
var fact1 = function(n) {
if (n < 2) return 1;
return n * fact1(n - 1);
};
// step 2
var fact2 = (function (f) {
return function (n) {
if (n < 2) return 1;
return n * f(f)(n-1);
};
})(function (f) {
return function (n) {
if (n < 2) return 1;
return n * f(f)(n - 1);
};
});
// step 3
var recur = function (f) {
return f(f);
}
var fact3 = recur(function (f) {
return function (n) {
if (n < 2) return 1;
return n * f(f)(n -1);
};
});
// step 4
var fact4 = recur(function (f) {
var g = function (n) {
return f(f)(n);
};
return function (n) {
if (n < 2) return 1;
return n * g(n - 1);
};
});
// step 5
var wrap = function (h) {
return recur(function (f) {
var g = function (n) {
return f(f)(n);
};
return h(g);
});
};
var fact5 = wrap(function (g) {
return function (n) {
if (n < 2) return 1;
return n * g(n-1);
};
});
// step 6
var wrap2 = function(h) {
return recur(function (f) {
return h(function (n) {
return f(f)(n);
});
});
};
var fact6 = wrap2(function (g) {
return function (n) {
if (n < 2) return 1;
return n * g(n - 1);
};
});
// step 7
var Y = function (h) {
return (function(f) {
return f(f);
})(function (f) {
return h(function (n) {
return f(f)(n);
});
});
};
var fact7 = Y(function (g) {
return function (n) {
if (n < 2) return 1;
return n * g(n - 1);
};
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment