所以,我刚开始与Kotlin一起试图解决骑士到达棋盘上目的地的最小步骤"问题。 这是我的代码:
fun knightSteps(i:Int,j:Int,a:Int,b:Int,board:Int,c :Int,d:Int,visited : MutableList<Pair<Int,Int>>,steps:Int):Int{
// (i,j) start (a,b)knight moves (c,d) destination visited - visited positions board - size of board
if(i==c && j==d) return steps
if(isValid(Pair(i,j),board)){
val v = visited
v.add(Pair(i,j))
var possible = mutableListOf<Int>()
if(Pair(i+a,j+b) !in v ) {
possible.add(knightSteps(i + a, j + b, a, b, board,c,d, v, 1 + steps))
}
if(Pair(i+a,j-b) !in v ) {
if(i==1&&j==3) println("YES!!")
possible.add(knightSteps(i + a, j - b, a, b, board,c,d, v, 1 + steps))
}
.
. // rest of other 8 possible moves
.
possible.removeAll{it==-1}
if(possible.size==0){
return -1
}
//println(possible)
return possible.min()!!
}
return -1
}
但是一旦它通过第一个&#39;如果&#39;条件&#39;访问&#39;和&#39; v&#39;可变列表正在改变它们的值,结果是println("YES!!")
在第二个&#39;如果&#39;永远不会被执行。
所以函数正在改变它们..如果我改变val v = visited.toMutableList(
,它会进入无限循环!有人可以帮忙。
答案 0 :(得分:1)
是的,在java和kotlin中,几乎所有内容都作为参考传递。但是在kotlin中你有编译时验证的能力使任何MutableList
不可变 - 只需将方法参数类型从MutableList
更改为List
答案 1 :(得分:1)
当您向visited
添加值时,它们将被添加到函数的参数中(即在函数外部也可见)。此外,v
和visited
指向同一对象。使用哪个变量来添加元素并不重要,之后列表将包含一个新元素。声明val v = visited
不会创建任何副本。
要复制列表,您可以执行visited.toList()
,其内容基本上映射到ArrayList(visited)
的调用。