javascript - 这种组合生成递归有什么问题?

标签 javascript algorithm combinations permutation powerset

我有以下代码:

const findMult_3 = (num) => {
  const powerset = (set) => {
    const combinations = []
    const combine = (prefix, chars) => {
      for (let i = 0; i < chars.length; i++) {
        combinations.push(prefix + chars[i])
        combine(prefix + chars[i], chars.slice(i + 1))
      }
    }
    combine('', set)
    return combinations
  }

  const allCombinations = powerset(num.toString().split(''))
  console.log(allCombinations)

}
findMult_3(362)

我希望它能工作,但是,输入 362,函数控制台记录:

[ '3', '36', '362', '32', '6', '62', '2' ]

它缺少 63、23、26 等变体。看来 slice 调用是罪魁祸首?

最佳答案

仍然不能 100% 确定 slice 调用的问题是什么,但我通过回避问题和避免改变我的数组来修复它:

const findMult_3 = (num) => {

  const powerset = (set) => {
    const combinations = []
    const combine = (prefix, chars) => {
      for (let i = 0; i < chars.length; i++) {
        combinations.push(prefix + chars[i])
        combine(prefix + chars[i], chars.filter((x, ind) => ind !== i))
      }
    }
    combine('', set)
    return combinations
  }
  
  const allCombinations = powerset(num.toString().split(''))

  console.log(allCombinations)

}

findMult_3(362)

注意使用filter而不是splice,保持不变性。

关于javascript - 这种组合生成递归有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51723173/

相关文章:

algorithm - Union-find 表示为社交网络

Python:是否有快捷方式来查找哪个子字符串(来自一组子字符串)在字符串中排在第一位?

python - 有什么比 itertools 更快的替代品?

Javascript 结构化错误处理

javascript - RethinkDB r.polygon() - GeoJSON LinearRing 必须至少有四个位置?

javascript - react 和 SVG Sprite

javascript - 如何使用 vuex 模块化复杂 View

c++ - 埃拉托色尼筛法误差

python - 如何生成数字范围的所有组合

r - 查找给定数据集中不存在的组合