排列组合算法
忙活了一晚上,终于搞清楚了排列组合算法,记录一下。
排列算法
/**
* 排列递归算法
* @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)