回溯算法 SKU全排列

509 阅读1分钟

文章起因:最近学了一天回溯算法,突然想起了之前写的惨不忍睹的代码,于是乎,我就感觉到......(狗头)

输入

const skuArr = [
    { attr: '尺寸', valueList: ['大', '小'] },
    { attr: '颜色', valueList: ['白', '红'] }
]

期望输出

[
    { "尺寸": "大", "颜色": "白" },
    { "尺寸": "大", "颜色": "红" },
    { "尺寸": "小", "颜色": "白" },
    { "尺寸": "小", "颜色": "红" }
]

回溯算法

console.log(getSku(skuArr))
function getSku(arr) {
    const len = arr.length
    if (len === 0) return []

    const ans = []
    backTrack(0, {})
    return ans

    function backTrack(idx, initObj) {
        if (idx === len) {
            ans.push({ ...initObj })
            return
        }
        const skuItem = arr[idx]
        for (const v of skuItem.valueList) {
            initObj[skuItem.attr] = v
            backTrack(idx + 1, initObj)
        }
    }
}

回溯与递归

  • 递归:函数的返回值要返回给上一层,也就是说,我们需要的值依赖深层函数的返回结果 (深拷贝的例子)
  • 回溯:函数的不一定有返回值,只是执行到底之拿到结果后,返回上一层,再继续找下一个结果,函数之间没有依赖关系