記事一覧

順列を書き並べる

お久しぶりです。
突然ですが、今日は訳あって任意の要素数の順列を書き並べるコードを考えていました。

せっかくなので関数型プログラミングっぽく。と思っていたのですが、要素の重複があった場合のことを考えると、indexを使って実装せざるを得ないですね。

[1, 2, 3, 4, 5]から[1, 2, 3]を抽出するコードは別で準備するということで。といってもslice(0, 3)するだけです。

//重複があると動かない
var f = function(a, p, c) {
  if (p.length == a.length) return c(p);
  a.forEach(function(i) {
    if (p.indexOf(i) != -1) return;
    f(a, p.concat([i]), c);
  });
};

//重複があってもいい
var f = function(a, p, c) {
  if (a.length == 0) return c(p);
  a.forEach(function(item, index, a) {
    f(
      a.slice(0, index).concat(
        a.slice(index + 1, a.length)
      ),
      p.concat([item]),
      c
    );
  });
}

f([1, 2, 3], [], function(row) {
  console.log(row);
});


階乗の性質上、どんどんどんどん総数が大きくなっていくので、実際にこの関数が使い物になるのはほんの小さな範囲だけです。JSだとせいぜいn=10ちょっとくらいだと思います。

そんな使い物にならないコードをわざわざ載せるのはどうなんだという気もしつつ、せっかく考えたので載せておきます。

コメント

コメントの投稿

非公開コメント

プロフィール

JDB Luigi

Author:JDB Luigi
どこにでもいるようなありふれた人間・・・という訳でもなく、かと言って怪しい宗教を信仰する変人という訳でも無い。

基本的に掲載しているコード等は煮ていただいても焼いていただいても結構ですが、利用は自己責任にてお願いいします。
また、バグ・アドバイス等もしあればよろしくお願いします。