You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何生成无重复的可重复组合?MATLAB递归代码内存溢出求助

解决MATLAB可重组合生成的无限递归问题

你的代码陷入了无限递归,这正是导致内存溢出报错的核心原因,我来帮你拆解问题并修复代码:

问题分析

你的repeat函数存在两个关键错误:

  1. 递归终止条件永远无法触发:递归调用时没有递增index参数,每次调用都传入相同的index值,导致永远达不到index == r的终止条件,无限循环调用自身。
  2. 终止逻辑的输出有误:原代码在终止时逐个输出元素,没有按组合格式打印,索引引用的逻辑也不够直观。

修正后的代码

function combs(arr, n, r)
    chosen = zeros(1, r, 'int8');  % 不需要r+1,r长度足够存储选中的元素索引
    repeat(chosen, arr, 1, r, 1, n);
end

function repeat(chosen, arr, index, r, start, ends)
    % 终止条件:当index超过r时,说明已经选满了r个元素
    if(index > r)
        % 打印当前组合,用空格分隔符合示例格式
        disp(arr(chosen));
        return;
    end
    
    for i = start:ends
        chosen(index) = i;
        % 递归调用时index+1,下一轮从当前i开始(保证可重复且无重复组合)
        repeat(chosen, arr, index + 1, r, i, ends);
    end
end

关键修复点说明

  • 递归终止条件调整:把index == r改成index > r,因为当index等于r时,我们还需要给第r个元素赋值,赋值完成后index变成r+1才是真正选完所有元素。
  • 递归调用递增index:每次递归调用时传入index + 1,确保每一层递归都在填充下一个位置的元素,逐步推进到终止条件。
  • 输出逻辑优化:直接打印arr(chosen),一次性输出完整的组合,完全匹配你示例中的格式要求。

测试验证

当你调用combs([1 3 5], 3, 2)时,会得到正确的可重组合:

1     1
     1     3
     1     5
     3     3
     3     5
     5     5

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:25:26