やり直し算数プログラミング#2 組み合わせ

すいません、これただの組み合わせでした。permutaionじゃなくてcombinationのほう。

function $A(nodes) {
        var a = [];
        for (var i = 0; i < nodes.length; i++) {
            var n = (nodes[i]);
                a.push(n);
        }
        return a;
}

(function combination() {
    var arg = $A(arguments);
    var cdr = arg.shift();
    var tail = [ [cdr], [] ];      
    if ( arguments.length == 1)
            return tail;
    else {
        var pairs = [];
        tail.forEach( function (n) {
               combination.apply(this, arg).forEach( function (m) {
                            pairs.push(n.concat(m));
                } );
        } );
        return pairs;
    }
}).apply(this, [1,2,3]);

まだいける。forEachとpushはreduceでなくせると思って試行錯誤するもわからなくて降参。

UNIXコマンドで順列・組み合わせの問題を解こうpermstrみたらflatmapがある。こういうときはflatなのか。

Array.prototype.flatten = function () {
    var a = []
    for (var i = 0; i < this.length; i++){
        if ( this[i] instanceof Array ) 
                a = a.concat(this[i]);
        else
            a.push();
    }
    return a;
};

(function combination() {
    var arg = $A(arguments);
    var cdr = arg.shift();

    if ( arguments.length == 0) {
            return [ [] ];
    } else {
        return [ [cdr], [] ].map( function (n) {
               return permutation.apply(this, arg).map( function (m) {
                            return (n.concat(m));
                } );
        } ).flatten();
    }
}).apply(this, [1,2,3]);

[ [1, 2, 3], [1, 2], [1, 3], [1], [2, 3], [2], [3], [] ]

に。もうちょっときれいになる気もする。

原田先生、8年遅れのいまごろLISPをどう書いたらいいのかわかった気がします。すいません。