递归替代循环打印嵌套数组:代码输出冗余元素问题排查
递归打印二维数组重复元素问题分析与修复
首先,咱们来拆解一下你代码里的问题根源:你的递归逻辑重复触发了下一行的打印调用,导致同一行被多次处理。
错误原因详解
你当前的代码在处理每个元素的递归调用返回后,都会执行y=0; x+=1; if(x<n) loop(a, x, y);这部分代码。举个具体的例子:
当你处理完第一行最后一个元素(x=0, y=2)时,会调用loop(a,1,0)开始打印第二行;等第二行的整个递归链执行完返回后,程序会回到x=0,y=2的函数调用上下文,继续执行后面的x+=1(变成1),然后再次调用loop(a,1,0)——这就导致第二行被重复打印了!
这种问题的核心是递归职责不清晰:你让同一个递归函数既要负责“打印当前行的下一个元素”,又要负责“切换到下一行”,导致下一行的打印被多次触发。
修正后的代码
我们可以简化递归逻辑,让每个递归调用只专注做一件事:
public class RecursionDoubleLoop { void loop(int[][] a, int x, int y) { // 终止条件:行索引超出数组长度,直接返回 if (x >= a.length) { return; } // 如果当前列索引超出当前行长度,切换到下一行的起始位置 if (y >= a[x].length) { loop(a, x + 1, 0); return; } // 打印当前元素,然后递归打印当前行的下一个元素 System.out.print(a[x][y] + " "); loop(a, x, y + 1); } public static void main(String[] args) { RecursionDoubleLoop obj = new RecursionDoubleLoop(); int[][] a = {{2, -36, 98}, {21, 55}, {2, 5, 4, 7, 6}, {101}}; obj.loop(a, 0, 0); } }
修正逻辑说明
- 终止条件优先:先判断行索引是否越界,越界就直接结束递归,不需要任何额外操作。
- 行切换逻辑:如果当前列索引已经到了当前行的末尾,就递归调用下一行的起始位置(
x+1, 0),然后返回,避免后续代码重复执行。 - 元素打印逻辑:如果当前元素有效,打印它,然后递归调用当前行的下一个元素(
y+1)。
这样整个递归链的流程是线性的:从(0,0)开始,逐个打印当前行元素,直到行尾,然后自动切换到下一行开头,直到所有行处理完毕,完全不会出现重复调用的情况。
测试结果
运行修正后的代码,输出正好符合你的预期:
2 -36 98 21 55 2 5 4 7 6 101
内容的提问来源于stack exchange,提问作者Regexes
相关产品推荐
相关产品推荐

