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

递归生成指定范围N×N矩阵时重复输出问题排查

问题原因分析

你的递归函数中save_matrix的调用时机错误,导致同一矩阵被重复写入:

当填充到非最后一行的最后一列时(比如N=3时的i=1,j=2),你先递归处理下一行的所有组合(这会完整遍历下一行的所有可能并保存对应的矩阵),递归返回后又执行了一次save_matrix——此时矩阵的下一行已经处于最后一种遍历状态(比如全1),而这个状态的矩阵已经被下一行的递归过程保存过了,因此出现重复。

同时,当填充到最后一行的最后一列时,递归调用i+1=size会直接返回,随后执行save_matrix,这部分是正确的,但前面的非最后一行的额外save_matrix操作导致了重复。

修复后的代码

调整递归逻辑,仅当矩阵完全填充完成(i == size)时才保存矩阵:

void get_all_matricies(int** matrix, int size, int min, int max, FILE* file, int i, int j) {
    // 矩阵已完全填充,保存并返回
    if(i == size) {
        save_matrix(matrix, size, file);
        return;
    }

    for(int k = min; k <= max; k++) {
        matrix[i][j] = k;
        if(j < size-1) {
            // 填充当前行的下一列
            get_all_matricies(matrix, size, min, max, file, i, j+1);
        } else {
            // 当前行已填充完,填充下一行的第一列
            get_all_matricies(matrix, size, min, max, file, i+1, 0);
        }
    }
}
逻辑说明
  1. 递归终止条件改为i == size:此时所有行都已填充完毕,调用save_matrix保存当前唯一的矩阵组合,避免重复。
  2. 移除else分支中的save_matrix调用:不再在填充完当前行后额外保存,而是让递归自然推进到所有行填充完成时再统一保存。
  3. 遍历每个可能的元素值k,赋值后递归处理下一个位置,保证每个矩阵组合只会被生成并保存一次。

这样修改后,N=3、元素范围0-1的场景下,会生成正确的64种矩阵组合,不会出现重复。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 09:37:41