2017/10/13

JS - 重複組合

給兩個序列 a 跟 b ,在不改變 a 和 b 序列順序的情況下,列出所有 a 跟 b 混合後的結果 使用[重複組合](https://zh.wikipedia.org/wiki/%E7%B5%84%E5%90%88#.E9.87.8D.E8.A4.87.E7.B5.84.E5.90.88.E7.90.86.E8.AB.96.E8.88.87.E5.85.AC.E5.BC.8F)的概念,兩個序列混合後的結果等同於其中一個序列的 index 的組合 舉例來說序列 a 為 `--`,序列 b 為 `**`,其所有混和結果為: ``` --** -*-* *--* -**- *-*- **-- ``` 共六種,而我們可以把 a 序列所在的 index 寫出: ``` 1,2 1,3 2,3 1,4 2,4 3,4 ``` 而這是 C4取2 的所有組合結果。 假設已知 b 序列長度為 6,我們可以使用迴圈生成組合。 ``` var set = { "a":['b','b','b','b'], "b":['3','4','5','6','7','8'] } var n = set['a'].length + set['b'].length; var c = []; for(var i1 = 0 ; i1 < n ; i1 ++) for(var i2 = i1+1 ; i2 < n ; i2 ++) for(var i3 = i2+1 ; i3 < n ; i3 ++) for(var i4 = i3+1 ; i4 < n ; i4 ++) for(var i5 = i4+1 ; i5 < n ; i5 ++) for(var i6 = i5+1 ; i6 < n ; i6 ++){ var ab = []; for(var i = 0 ; i < n ; i ++) ab.push('a'); ab[i1] = 'b'; ab[i2] = 'b'; ab[i3] = 'b'; ab[i4] = 'b'; ab[i5] = 'b'; ab[i6] = 'b'; var c0 = []; var index = {"a":0,"b":0}; for(var i = 0 ; i < n ; i ++){ c0.push(set[ab[i]][index[ab[i]]]); index[ab[i]] = index[ab[i]] + 1; } c.push(c0); console.log(c0); } ```

沒有留言: