昨日は重複順列をjavascriptで実装しましたが、今日はその仲間である組み合わせと重複組み合わせに挑戦します。
rubyでいうところのcombinationとrepeated_combinationですね。
詳しい仕様については一昨日書いた通りなので、それを参照してください。
というより、昨日の記事が一昨日の延長でした。
つまり三日連続似たようなことをやっているわけですね。
まずふつうの組み合わせですが、イメージとしてはこんな感じ。
[2] => 2より大きい数字を入れる => 3,4 => [2,3],[2,4] [2,3] => 3より大きい数字を入れる => 4 => [2,3,4] [2,4] => 4より大きい数字を入れる => なし
最新の値より大きいものを入れていくわけですね。
もちろん上記の例の数字はインデックスですから、これをもともとの配列の値に還元して返すわけですね。
次いで重複組み合わせは次のようなイメージ。
[2] => 2以上の数字を入れる => 2,3,4 => [2,2],[2,3],[2,4] [2,3] => 3以上の数字を入れる => 3,4 => [2,3,3][2,3,4] [2,4] => 4以上の数字を入れる => 4 => [2,4,4]
つまり、普通の組み合わせでは「より大きい」だった条件分岐を「以上」に変更するだけで、重複組み合わせはできてしまうわけです。
実際のコードでもイコール記号をつけるかつけないかだけ。
条件分岐を一か所書き換えるだけの簡単な作業でした。
具体的には31行目と62行目。
// l.31 組み合わせでは return lastIdx < idx; // l.62 重複組み合わせでは return lastIdx <= idx;
コピペプログラミングここに極まれり。