首页 > 解决方案 > 如何优化包含重复值的组合?

问题描述

我有一个包含三个值的数组。

["a","b","c"]

我正在尝试使用上述数组创建以下组合。

0:  ["a", "a", "a"]
1:  ["a", "a", "b"]
2:  ["a", "a", "c"]
3:  ["a", "b", "b"]
4:  ["a", "b", "c"]
5:  ["a", "c", "c"]
6:  ["b", "b", "b"]
7:  ["b", "b", "c"]
8:  ["b", "c", "c"]
9:  ["c", "c", "c"]

我编写了成功的代码。但是代码没有优化。我怎样才能使这段代码简单。

function test(arr, arr2=[], result=[]) {
    if (arr2.length < 3) {
        let proxy_arr = [...arr];
        Object.keys(proxy_arr).forEach(index=>{
            if (!test(arr, [...arr2].concat(proxy_arr[index]), result)) {
                result.push([...arr2].concat(proxy_arr[index]));

            } else {
                //debugger;
                arr = arr.slice(1);
            }

        }
        );
        return result;

    }
    return false;
}
result = test(["a", "b", "c"]);

标签: javascriptrecursionoptimizationcombinationsrepeat

解决方案


您可以使用递归生成器函数来完成大部分工作。 Array.from生成器会将结果填充到数组中。

let vec = ['a', 'b', 'c'];

function* combo(n, k = 0, prefix = []) {
  if (n == 0) yield prefix;
  else for (let i = k; i < vec.length; ++i) {
    yield* combo(n - 1, i, [...prefix, vec[i]]);
  }
}

let test = Array.from(combo(3));

console.log(JSON.stringify(test));


推荐阅读