なぜかまたcombination

function range(from, to) {
    var r = [];
    for( var i = from; i <= to; i++ ) { r.push(i) }
    return r;
}
    
function flatten(a) {
    return a.reduce( function (head, me) {
        return head.concat(me);
    }, []);
}

function combination(s, n) {
    if ( n <= 1 ) {
        return s.map( function(n) [n] );
    } else {
        // n > 2
        var r = ( range(0, s.length -1).map( function (i) {
            var first= s.slice(i, i+1)
            var ret = combination(s.slice(i+1), n-1);
            return ret.map( function (n) {
                return ( first.concat(n) )
            } );
        } ) );
        return flatten(r);
    }
}
combination([1,2,3], 1); //[[1], [2], [3]]
combination([1,2,3], 2); //[[1, 2], [1, 3], [2, 3]]
combination([1,2,3,4,5], 2); //[[1, 2], [1, 3], [1, 4], [1, 5], [2, 3], [2, 4], [2, 5], [3, 4], [3, 5], [4, 5]]

まえよりきれいになった気がする。