読者です 読者をやめる 読者になる 読者になる

nekoTheShadow’s diary

技術ブログとして始めたはずが、読書&愚痴ブログになりました(´・ω・`)

< or ≦ ; that is the question.

昨日は重複順列を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;

コピペプログラミングここに極まれり。