有时候我们需要获取数组元素的所有可能组合,可以通过递归实现
//arr表示源数组,size表示选取元素的个数
function combination(arr,size){
//定义数组保存结果
var result = []
//selected数组包含已经选中的元素
//arr数组包含未选中元素数组,size表示还需选取元素的个数
function _combine(selected,arr,size){
//如果size===0,则一次组合完成,存入result数组并返回
if(size===0){
result.push(selected)
return
}
//遍历所有可能选中的元素,遍历的次数为数组长度减去(size-1)
for(let i = 0;i<arr.length-(size-1);i++){
//复制数组,避免对selected数组数据的更改
let temp = selected.slice()
temp.push(arr[i])
_combine(temp,arr.slice(i+1),size-1)
}
}
_combine([], arr, size);
return result;
}
下面调用函数,测试数组为[1,2,3,4],从这四个元素里面选择两个进行组合,打印该所有可能:
console.log(combination([1,2,3,4],2))
输出结果:
[ [ 1, 2 ], [ 1, 3 ], [ 1, 4 ], [ 2, 3 ], [ 2, 4 ], [ 3, 4 ] ]
递归实现的基本思路就是循环嵌套调用,把复杂的问题拆分成简单的问题。