如何生成无重复的可重复组合?MATLAB递归代码内存溢出求助
解决MATLAB可重组合生成的无限递归问题
你的代码陷入了无限递归,这正是导致内存溢出报错的核心原因,我来帮你拆解问题并修复代码:
问题分析
你的repeat函数存在两个关键错误:
- 递归终止条件永远无法触发:递归调用时没有递增
index参数,每次调用都传入相同的index值,导致永远达不到index == r的终止条件,无限循环调用自身。 - 终止逻辑的输出有误:原代码在终止时逐个输出元素,没有按组合格式打印,索引引用的逻辑也不够直观。
修正后的代码
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
相关产品推荐
相关产品推荐

