无sort()的组合算法需求:生成以1 2 3起始的升序组合序列
解决组合序列正序输出问题
嘿,我来帮你调整这段代码,让它输出从1 2 3开始的正序组合,完全不用sort()方法!
问题根源分析
原来的代码是从大数往小数倒着选元素:先选最大的i(比如6)放到数组末尾,再递归处理更小的数,最后输出的时候自然是从最大的组合4 5 6开始倒序排列。要得到正序,我们需要改成从小数往大数选元素,保证每一步选的数都比前一个大,这样递归生成的组合就是自然递增的顺序。
修改后的代码
let result = ""; const N = 6; const M = 3; const arr = new Array(M); combi(1, M, arr, 0); alert(result); function combi(start, remain, arr, currentIndex) { // 从start开始,到N - remain + 1结束(保证后面还有足够的数可选) for (let i = start; i <= N - remain + 1; i++) { // 把当前选的数放到数组的当前索引位置 arr[currentIndex] = i; if (remain > 1) { // 递归:下一个数要比当前大(i+1),剩余要选的数减1,索引加1 combi(i + 1, remain - 1, arr, currentIndex + 1); } else { // 输出当前组合 result += arr.join(" ") + "\n"; } } }
关键修改点说明
- 循环方向调整:从
start(初始为1)开始递增循环,而不是从n往下递减,保证先选小数。 - 递归参数调整:递归时传入
i+1作为下一次的起始值,确保下一个选的数一定比当前大,避免重复组合且保证递增顺序。 - 数组填充方式:从数组的
currentIndex(从0开始)依次填充,而不是从末尾往前填,这样数组里的元素本身就是按顺序排列的。 - 循环边界控制:
i <= N - remain + 1是为了确保剩下的位置还有足够的数可选,比如选第1个数时,最多只能选到6-3+1=4,这样后面才能选出两个更大的数。
这样修改后,代码会依次输出1 2 3、1 2 4、1 2 5……3 5 6、4 5 6,完全符合你的预期!
内容的提问来源于stack exchange,提问作者JamesHeo




