Skip to content

Instantly share code, notes, and snippets.

@deepak1556
Last active September 30, 2016 17:23
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save deepak1556/ff0e9f55983f7f1b45bc to your computer and use it in GitHub Desktop.
Save deepak1556/ff0e9f55983f7f1b45bc to your computer and use it in GitHub Desktop.
Differnt styles of factorial implemetation in js for fun
/** Newbie Programmer */
function fac(n) {
if(n === 0)
return 1;
else
return n * fac(n-1);
}
/** Callback programmer */
function fact(n, cback) {
function nextFact(n, acc) {
if (typeof n !== 'number') {
cback(new Error('Not a number'), null);
} else if (n < 0) {
cback(new Error('Less than zero'), null);
} else if (n === 0) {
cback(null, acc);
} else {
nextFact(n - 1, acc * n);
}
}
setTimeout(nextFact(n, 1), 0);
}
/** Promise Programmer */
var fac = function(n) {
return new Promise(function (res,rej) {
if(n == 1)
res(1);
else
fac(n-1).then(function(result) {
res(result * n);
});
});
}
fac(n).then(function(res) {
console.log(res);
});
/** Generator programmer */
var fac_gen = function* (n, acc) {
if (n === 0) {
return acc;
} else {
yield fac_gen(n - 1, n * acc);
}
};
var fac = function (n) {
var c = fac_gen(n, 1);
var d = {};
while (!d.done) {
d = c.next();
c = d.value;
}
return d.value;
}
/** Lazy Programmer */
function Mult(n) {
return function () {
return [n+1, Mult(n+1)];
}
}
function apply(f) {
return typeof f === "function" ? f() : f;
}
function take(n, g) {
if(n) {
var xs = apply(g);
return xs[0] * take(n-1, xs[1])
} else {
return 1;
}
}
take(n, Mult(0)) // => Same as fac(n)
/* combinatory Programmer */
fuhction Y(x) {
return function (n) {
return x(x)(n);
}
}
var fac = Y(function (fac) {
return function (n) {
return n === 0 ? 1 : n * fac(fac)(n-1)
}
})
/=> fac(n)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment