递归生成指定范围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); } } }
逻辑说明
- 递归终止条件改为
i == size:此时所有行都已填充完毕,调用save_matrix保存当前唯一的矩阵组合,避免重复。 - 移除else分支中的
save_matrix调用:不再在填充完当前行后额外保存,而是让递归自然推进到所有行填充完成时再统一保存。 - 遍历每个可能的元素值k,赋值后递归处理下一个位置,保证每个矩阵组合只会被生成并保存一次。
这样修改后,N=3、元素范围0-1的场景下,会生成正确的64种矩阵组合,不会出现重复。
内容的提问来源于stack exchange,提问作者polaszek
相关产品推荐
相关产品推荐

