我对 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()
方法。
它的实现大致是这样的:
创建类的新实例
将
this
中找到的所有字段分配给新实例返回新实例。
关于Java:递归和按值传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34192168/