(function () { function comb(n, lst) { if (!n) return [[]]; if (!lst.length) return []; var x = lst[0], xs = lst.slice(1); return comb(n - 1, xs).map(function (t) { return [x].concat(t); }).concat(comb(n, xs)); } // [m..n] function range(m, n) { return Array.apply(null, Array(n - m + 1)).map(function (x, i) { return m + i; }); } return comb(3, range(0, 4)) .map(function (x) { return x.join(' '); }).join('\n'); })();