gpt4 book ai didi

Java:递归和按值传递

转载 作者:行者123 更新时间:2023-11-30 08:06:42 25 4
gpt4 key购买 nike

我对 Java 中的递归有点困惑:

public int recursion(Board board2,int x){
Board board1 = board2;
if(x==3){
System.out.println("End");
return 0;
}

board1.fix(obj, Color.BLUE, x, 12);
return recursion(board1, x+1);

}

这只是将对象放入板中的示例。如何更改 board1,但不更改作为参数传入的原始板?由于在方法之外,我作为参数传递的 Board 在执行后发生了变化,我不明白为什么。我读到 Java 按值传递而不是按引用传递。我想让程序在递归过程中回到原来的状态,而不是改变真实的棋盘。

编辑

我这样试过,还是不行:

public int recursion(Board board2,int x){
try{
board1 = (Board)board2.clone();
}catch (Exception e){
System.out.println("Error "+e);
}
if(x==3){
System.out.println("End");
return 0;
}

board1.fix(obj, Color.BLUE, x, 12);
return recursion(board1, x+1);
}

编辑 2

下面是我实现克隆方法的方法

class Board extends JPanel implements Cloneable{
// ...
@Override
protected Board clone() throws CloneNotSupportedException{
return(Board) super.clone();
}
// ...

编辑 3

我仍然无法让它工作

class Board extends JPanel implements Cloneable{
public Color[][] board;

@Override
public Board clone(){
Board board1 = new Board();
board1.board = this.board;
return board1;
}
// ...
}

最佳答案

在该方法中,参数 board2 持有与您传递给该方法的参数相同的引用。而且我猜你不希望它是这样的。你想要一份具有相同但不同引用的棋盘副本,这样你对副本所做的影响就不会影响你传入的参数。我说得对吗? (我能读懂你的想法!)

clone() 方法最适合这种情况!首先,在 Board 类中,实现 Cloneable

public class Board implements Cloneable {

}

然后给它添加clone()方法。

它的实现大致是这样的:

  1. 创建类的新实例

  2. this中找到的所有字段分配给新实例

  3. 返回新实例。

关于Java:递归和按值传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34192168/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com