You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

无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 31 2 41 2 5……3 5 64 5 6,完全符合你的预期!

内容的提问来源于stack exchange,提问作者JamesHeo

火山引擎 最新活动