js数组元素组合(递归实现)

有时候我们需要获取数组元素的所有可能组合,可以通过递归实现

//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 ] ]

递归实现的基本思路就是循环嵌套调用,把复杂的问题拆分成简单的问题。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值