一维数组中取N个元素列出所有组合

该文章介绍了一种使用递归算法解决从给定数组中找出所有可能的N个元素组合的方法。在JavaScript函数compose中,通过递归遍历数组的不同起始点,计算出所有可能的组合,并将结果存储在records数组中。示例展示了从数组[a,b,c,d]中取出2个元素的所有组合。
摘要由CSDN通过智能技术生成

给定一个数组如:nums=[1, 2, 3, 4, 5, 6,7,8,9,10],取出其中任意N个元素,组成新的数组,求有多少种组合。

#1.思路

如果N确定,如N=4,此时,可以直接用四个for循环嵌套实现,但是当任意取出的个数N不固定时,此时不知道要用多少个for循环来实现,可考虑用递归来实现多个循环。

递归的思路:(假设输入N=4)

先找出第一个数的循环起止地址,在数组nums索引号为0~6,然后找出第二个是1到7,第三个是2到8,第三个是3到9,第四个数是4到10。



function compose(originArr, start, count, N, res, records) {
    let lastIdx = originArr.length - count + 1;
    console.log("compose")
    for (let i = start; i < lastIdx; i++) {
        res[count - 1] = i;
        console.log("set count = ", count, ", start = ", start, ", lastIdx = ", lastIdx, ", i = ", i, ", res = ", JSON.stringify(res));
        if (count - 1 === 0) {
            let line = [];
            for (let j = N - 1; j >= 0; j--) {
                line.push(originArr[res[j]]);
            }
            console.log("end start = ", start, " lastIdx = ", lastIdx, ", res = ", JSON.stringify(res), ", line = ", JSON.stringify(line));
            records.push(line);
        } else {
            compose(originArr, i + 1, count - 1, N, res, records);
        }
    }
}

let originArr = ['a','b','c','d'];
let N = 2;
let records = [];
compose(originArr, 0, N, N, [], records);
console.log("records = ", JSON.stringify(records), "\n\n")



结果:

set count =  2 , start =  0 , lastIdx =  3 , i =  0 , res =  [null,0]
src/test_compose.js:7
compose
src/test_compose.js:4
set count =  1 , start =  1 , lastIdx =  4 , i =  1 , res =  [1,0]
src/test_compose.js:7
end start =  1  lastIdx =  4 , res =  [1,0] , line =  ["a","b"]
src/test_compose.js:13
set count =  1 , start =  1 , lastIdx =  4 , i =  2 , res =  [2,0]
src/test_compose.js:7
end start =  1  lastIdx =  4 , res =  [2,0] , line =  ["a","c"]
src/test_compose.js:13
set count =  1 , start =  1 , lastIdx =  4 , i =  3 , res =  [3,0]
src/test_compose.js:7
end start =  1  lastIdx =  4 , res =  [3,0] , line =  ["a","d"]
src/test_compose.js:13
set count =  2 , start =  0 , lastIdx =  3 , i =  1 , res =  [3,1]
src/test_compose.js:7
compose
src/test_compose.js:4
set count =  1 , start =  2 , lastIdx =  4 , i =  2 , res =  [2,1]
src/test_compose.js:7
end start =  2  lastIdx =  4 , res =  [2,1] , line =  ["b","c"]
src/test_compose.js:13
set count =  1 , start =  2 , lastIdx =  4 , i =  3 , res =  [3,1]
src/test_compose.js:7
end start =  2  lastIdx =  4 , res =  [3,1] , line =  ["b","d"]
src/test_compose.js:13
set count =  2 , start =  0 , lastIdx =  3 , i =  2 , res =  [3,2]
src/test_compose.js:7
compose
src/test_compose.js:4
set count =  1 , start =  3 , lastIdx =  4 , i =  3 , res =  [3,2]
src/test_compose.js:7
end start =  3  lastIdx =  4 , res =  [3,2] , line =  ["c","d"]
src/test_compose.js:13
records =  [["a","b"],["a","c"],["a","d"],["b","c"],["b","d"],["c","d"]] 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值