コンビネーションソートアルゴリズムの定理


くりかえしくみたて
1.配列からインデックスを選択し、1を減算して再度呼び出す
2.インデックスが1の場合、各要素は配列として返されます.
3.戻り値を1から選択した値とマージ
くりかえしくみたて
function perm(array, length) {
    return array.flatMap((v, i) => length > 1
        ? perm(array, length - 1).map(w => [v, ...w])
        : [[v]]
    );
}
perm(['a', 'b', 'c', 'd', 'e'], 3).forEach(a => console.log(...a));
コンポジット
1.配列から1つを選択し、配列とインデックスから1を減算して、再度呼び出します.
2.インデックスが1の場合、各要素は配列として返されます.
3.戻り値を1から選択した値とマージ
コンポジットコード
function comb(array, length) {
    return array.flatMap((v, i) => length > 1
        ? comb(array.slice(i + 1), length - 1).map(w => [v, ...w])
        : [[v]]
    );
}
comb(['a', 'b', 'c', 'd', 'e'], 3).forEach(a => console.log(...a));
整列
const perm= function (arr, len) {
    const results = [];
    if (len === 1) return arr.map((value) => [value]); // 1개씩 택할 때, 바로 모든 배열의 원소 return
  
    arr.forEach((fixed, index, origin) => {
      const rest = [...origin.slice(0, index), ...origin.slice(index+1)] // 해당하는 fixed를 제외한 나머지 배열 
      const permutations = perm(rest, len - 1); // 나머지에 대해 순열을 구한다.
      const attached = permutations.map((permutation) => [fixed, ...permutation]); // 돌아온 순열에 대해 떼 놓은(fixed) 값 붙이기
      results.push(...attached); // 배열 spread syntax 로 모두다 push
    });
  
    return results; // 결과 담긴 results return
};
https://www.python2.net/questions-777952.htm
https://jun-choi-4928.medium.com/javascript%EB%A1%9C-%EC%88%9C%EC%97%B4%EA%B3%BC-%EC%A1%B0%ED%95%A9-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0-21df4b536349