给定一个数组如: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"]]