【问题标题】:Printing elements in nested array with recursion instead of loop使用递归而不是循环打印嵌套数组中的元素
【发布时间】:2020-09-05 14:06:26
【问题描述】:

我一直在尝试打印元素

int[][]a= {{2,-36,98},{21,55},{2,5,4,7,6},{101}}

借助递归而不是循环。现在我有一段代码,但它会打印出多余的不需要的元素。

public class RecursionDoubleLoop {
    void loop(int[][]a,int x,int y)
    {
        int n=a.length;
        if(x<n)
        {

            if(y<a[x].length)
            {

                System.out.println(a[x][y]+" ");

                y+=1;
                if(y<a[x].length)
                loop(a, x, y);
            }
            y=0;
            x+=1;
            /*if(x>=n)
            {
                System.exit(0);
            }*/
            if(x<n) {
            loop(a, x, y);}
        }
    }
    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);
    }

}

现在预期的输出是

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

我的输出

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

尝试调试,但最终不得不取消注释 System.exit(0) 函数。

如果有人能指出错误将非常有帮助。

【问题讨论】:

    标签: java arrays loops recursion


    【解决方案1】:

    您是如此接近,以至于告诉您解决方案会很痛苦。您需要做的只是return 检查y &lt; a[x].length。这是因为对循环的递归调用将增加y,直到这是false,并最终继续增加x。这么亲密的人。

    if (y < a[x].length) {
        loop(a, x, y);
        return;
    }
    

    输出

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

    【讨论】:

    • 你能解释一下吗,因为我是初学者,需要更多关于这方面的知识。
    • 当然。有什么特别让你难过的部分吗?是关于return的使用吗?
    • 这是关于使用 return 以及为什么我的代码不起作用?我的意思是我仍然正确地使用了 if 条件:(
    • 您提供的代码不起作用,因为在每次调用 loop 随后完成后,x 总是递增,如果 x 小于 n,它将再次循环。通过在循环 y 时使用 return,我们不会增加 x。通过这样做,在下一次调用循环时,x 将按预期递增。我希望这会有所帮助。
    【解决方案2】:

    进入下一行时,您需要将内部代码包装在 else 块中。此外,那里不需要一些检查,因为它们会被递归捕获。

    void loop(int[][] a, int x, int y) {
        int n = a.length;
        if (x < n) {
            if (y < a[x].length) {
                System.out.print(a[x][y] + " ");
                loop(a, x, y + 1);
            } else {
                loop(a, x + 1, 0);
            }
        }
    }
    

    我是怎么想出来的?我在方法的第一行打印了"loop " + x + " " + y,以找出您的代码有什么问题。很容易看出您的实现很好,但在增加 x 时它并没有停止。

    如果你想要一个比较实现(基本上,反转 if 条件),你可以试试这个:

    void loop(int[][] a, int x, int y) {
        if (x >= a.length) return;
        if (y >= a[x].length) {
            loop(a, x + 1, 0);
        } else {
            System.out.print(a[x][y] + " ");
            loop(a, x, y + 1);
        }
    }
    

    【讨论】:

      【解决方案3】:

      检查x 是否达到行数限制或y 是否大于列数限制 然后从递归中返回。

      ,检查y是否达到列限制,然后开始新的递归以获取具有x+1和y0的其他数组,然后从递归中返回。

      ,所以第二个条件会增加x 并且内部递归会增加y

          void loop(int[][] a, int x, int y) {
              if (x >= a.length || y > a[x].length)
                  return;
              if (y == a[x].length) {
                  System.out.println();
                  loop(a, x + 1, 0);
                  return;
              }
      
              System.out.print(a[x][y] + " ");
              loop(a, x, y + 1);
          }
      

      ,输出

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-23
        • 1970-01-01
        • 2019-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-10
        相关资源
        最近更新 更多