2017-05-20 13 views
1

与えられたarr = ['mat','cat','fat']
関数getComb(arr, n = 2)ここで、nは各組み合わせに必要な単語の数です。
期待される結果:
マット猫
マット脂肪
猫の脂肪
私は、望ましい結果を得るために、任意の更なる下のコードを変更することができませんでした。何か案が? THX Knskan3m単語の配列からのn個の単語の組み合わせ - Javascript

ありがとう:

'getCombinations': (arr, n) => { 
     let i, j, k, elem, l = arr.length, childperm, ret = []; 
     if (n === 1) { 
     for (let i = 0; i < arr.length; i++) { 
      ret.push([arr[i]]);   
     } 
     return ret; 
     } 
     else { 
     for (i = 0; i < l; i++) { 
      elem = arr.shift(); 
      for (j = 0; j < elem.length; j++) { 
      childperm = lib.getCombinations(arr.slice(), n - 1); 
      for (k = 0; k < childperm.length; k++) { 
       ret.push([elem[j]].concat(childperm[k])); 
      } 
      } 
     } 
     return ret; 
     } 
    }, 
+0

は、オーダーの問題をしていますか? ['cat'、 'mat'] '[cat mat']または['cat mat'、 'mat cat']のn === 2の出力を期待しますか? – Paul

+0

注文の組み合わせがありません。それはここでは当てはまらない順列のためのものにすぎない。 :) –

答えて

0

私はスペース効率generator functionをお勧め:

// Generate all k-combinations of first n array elements: 
 
function* combinations(array, k, n = array.length) { 
 
    if (k < 1) { 
 
    yield []; 
 
    } else { 
 
    for (let i = --k; i < n; i++) { 
 
     for (let combination of combinations(array, k, i)) { 
 
     combination.push(array[i]); 
 
     yield combination; 
 
     } 
 
    } 
 
    } 
 
} 
 

 
// Example: 
 
console.log(...combinations(['mat', 'cat', 'fat'], 2));

+0

ループの代わりに 'yield *の組み合わせ(array、k、i)'を使用しない理由はありますか? –

+0

どのように結果を変数に代入できますか? 'y = ...の組み合わせ(['mat'、 'cat'、 'fat']、2)' Uncaught SyntaxError:Unexpected token ... "を返します。 –

+0

@FredJ。 'y = [... combination(array、2)]'はこのトリックを行うべきです。 –

関連する問題