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

递归替代循环打印嵌套数组:代码输出冗余元素问题排查

递归打印二维数组重复元素问题分析与修复

首先,咱们来拆解一下你代码里的问题根源:你的递归逻辑重复触发了下一行的打印调用,导致同一行被多次处理。

错误原因详解

你当前的代码在处理每个元素的递归调用返回后,都会执行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);
    }
}

修正逻辑说明

  1. 终止条件优先:先判断行索引是否越界,越界就直接结束递归,不需要任何额外操作。
  2. 行切换逻辑:如果当前列索引已经到了当前行的末尾,就递归调用下一行的起始位置(x+1, 0),然后返回,避免后续代码重复执行。
  3. 元素打印逻辑:如果当前元素有效,打印它,然后递归调用当前行的下一个元素(y+1)。

这样整个递归链的流程是线性的:从(0,0)开始,逐个打印当前行元素,直到行尾,然后自动切换到下一行开头,直到所有行处理完毕,完全不会出现重复调用的情况。

测试结果

运行修正后的代码,输出正好符合你的预期:

2 -36 98 21 55 2 5 4 7 6 101 

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 17:57:27