排列组合算法

忙活了一晚上,终于搞清楚了排列组合算法,记录一下。

排列算法

/**
 * 排列递归算法
 * @param {*} elements 
 * @param {*} m 排列第一个数索引
 * @param {*} n 排列最后一个数的索引
 * @returns 
 */
function permRecursive(elements, m = 0, n) {
    let result = []
    n = n ?? elements.length - 1
    if (m === n) {
        result.push([...elements])
        return result
    }
    else {
        for (let i = m; i <= n; i++) {
            swap(elements, m, i)
            result = result.concat(permRecursive(elements, m + 1, n))
            swap(elements, m, i)
        }
    }
    return result
}

function swap(arr, a, b) {
    let temp = arr[a]
    arr[a] = arr[b]
    arr[b] = temp
}

组合算法

// 组合算法
function choose(arr, size) {
    let result = []
    const len = arr.length
    size = size || len
    if (size > len) {
        return result
    }
    
    for (let i = 0; i < len; i++) {
        const item = arr[i]
        if (size === 1) {
            result.push([item])
        }
        else {
            let tempArr = [...arr]
            tempArr = tempArr.slice(i+1)
            const tempResult = choose(tempArr, size - 1)
            tempResult.forEach(e => {
                result.push([item, ...e])
            })
        }
    }
    
    return result
}

排列组合一起计算

// 排列组合
function permutationAndCombination(arr, m) {
    let result = []
    const n = arr.length
    m = m ?? n
    for (let i = 1; i <= n; i++) {
        const combination = choose(arr, i)
        combination.forEach(e => {
            const permutation = permRecursive(e)
            result = result.concat(permutation)
        })
    }
    return result
}

评论

0/500

全部评论 (0)

这里没有评论,要抢沙发吗?