【问题标题】:Array not holding the previous value in recursion(JAVA)数组不包含递归中的前一个值(JAVA)
【发布时间】:2018-10-20 05:59:59
【问题描述】:

我想在从递归返回后保留以前的值。 它适用于 COUNT,但 Array 没有保存我想要的先前值。

结果是:

递归前[0, 0, 0, 0]计数:0

递归前[0, 1, 0, 0]计数:1

递归前[0, 1, 2, 0]计数:2

递归前[0, 1, 2, 3]计数:3

递归后[0, 1, 2, 3]计数:3

递归后[0, 1, 2, 3]计数:2

递归后[0, 1, 2, 3]计数:1

递归后[0, 1, 2, 3]count: 0

但我想要的结果是:

递归前[0, 0, 0, 0]计数:0

递归前[0, 1, 0, 0]计数:1

递归前[0, 1, 2, 0]计数:2

递归前[0, 1, 2, 3]计数:3

递归后[0, 1, 2, 3]计数:3

递归后[0, 1, 2, 0]计数:2

递归后[0, 1, 0, 0]count: 1

递归后[0, 0, 0, 0]count: 0

 import java.util.Arrays;

 import  java.util.Scanner;

 public class main {

     public static void boarder(int board[],int count)
     {

         if(count==4)
         {
             return;
         }
         board[count]=count;
         int temp=count+1;

         System.out.println("before recursion"+Arrays.toString(board)+"count: "+(count));
         boarder(board,temp);
         System.out.println("After recursion"+Arrays.toString(board)+"count: "+(count));

     }

     public static void main(String[] args)
     {
         int count=0;
         int board[]={0,0,0,0};
         //state tic=new state(board);
         boarder(board,0);
     }

 }

【问题讨论】:

  • 这是一个典型的引用问题。请记住,board 数组是通过引用传递并在回归调用堆栈中进行操作的单个对象。如果要在回归调用返回时打印数组的状态,则必须将数组的副本保存在局部变量中才能打印出来。
  • 通过复制数组,我的意思是创建一个新对象(克隆),因此在回归调用之前保存数组的状态。像这样stackoverflow.com/q/14149733/2727717

标签: java recursion


【解决方案1】:

您的代码按预期工作。

最后的board[][0, 1, 2, 3]

你看到 after 字符串是相同的,因为它是在递归完成后执行的,当你的 board[] = [0, 1, 2, 3] 所以它们都打印相同的字符串

【讨论】:

    【解决方案2】:

    board 是一个数组,它是一个对象,但 count 是一个原始变量。对于基元,值是按值传递的,而对于对象,值是通过引用传递的。因此,相同的对象(相同的内存位置)通过“板”的方法传递。因此,当您对“板”进行更改时,该更改会反映在“板”所指的所有地方。原始变量(在本例中为“count”)的行为方式并非如此。每次通过方法时都会创建一个新的内存位置。当您对传递的变量进行更改时,它不会更改原始变量。

    【讨论】:

      【解决方案3】:

      你需要阅读this

      将您的 boarder 功能更改为

      board[count]=count;
      int temp=count+1;
      int[] tempArr = Arrays.copyOf(board, board.length);
      System.out.println("before recursion"+Arrays.toString(board)+"count: "+(count));
      boarder(tempArr,temp);
      System.out.println("After recursion"+Arrays.toString(board)+"count: "+(count));
      

      【讨论】:

      • 如果他这样做,他将操作数组的不同副本,而不是原始的board 数组本身。我建议打印副本tempArr,但不要将其传递到回归调用堆栈中。
      【解决方案4】:

      你应该像这样恢复以前的值。

      public static void boarder(int board[], int count) {
          if (count == 4) {
              return;
          }
          int previous = board[count];
          board[count] = count;
          int temp = count + 1;
          System.out.println("before recursion" + Arrays.toString(board) + "count: " + (count));
          boarder(board, temp);
          System.out.println("After recursion" + Arrays.toString(board) + "count: " + (count));
          board[count] = previous;
      }
      

      结果

      before recursion[0, 0, 0, 0]count: 0
      before recursion[0, 1, 0, 0]count: 1
      before recursion[0, 1, 2, 0]count: 2
      before recursion[0, 1, 2, 3]count: 3
      After recursion[0, 1, 2, 3]count: 3
      After recursion[0, 1, 2, 0]count: 2
      After recursion[0, 1, 0, 0]count: 1
      After recursion[0, 0, 0, 0]count: 0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-15
        • 1970-01-01
        • 2019-05-27
        • 1970-01-01
        • 1970-01-01
        • 2013-01-11
        • 1970-01-01
        • 2020-08-23
        相关资源
        最近更新 更多