以下是使用 Johnson-Trotter 演算法查找給定數字排列的 Scala 代碼:-
import scala.collection.mutable.ArrayBuffer
object Code{
def factorial(x:Int):Int={
if(x==0) return 1 else x*factorial(x-1)
}
def permutation(arr:ArrayBuffer[Int]):ArrayBuffer[ArrayBuffer[Int]]={
val len=arr.length;
var result=new ArrayBuffer[ArrayBuffer[Int]]
for(i<-Range(0,factorial(len)/len,1)){
if(i%2==0){
for(j<-Range(len-1,0,-1)){
var c=arr(j)
arr(j)=arr(j-1)
arr(j-1)=c
result.append(arr)
}
var c=arr(len-1)
arr(len-1)=arr(len-2)
arr(len-2)=c
result.append(arr)
}
else{
for(j<-Range(0,len-1,1)){
var c=arr(j)
arr(j)=arr(j 1)
arr(j 1)=c
result.append(arr)
}
var c=arr(0)
arr(0)=arr(1)
arr(1)=c
result.append(arr)
}
}
return result
}
def main(args:Array[String]):Unit={
var arr=ArrayBuffer(1,2,3)
var perm=permutation(arr)
for(j<-Range(0,perm.length,1)){
for(k<-Range(0,perm(0).length,1)){
println(" " perm(j)(k))
}
println()
}
}
}
但是,對于 (1,2,3) 的 ArrayBuffer 輸入,生成的二維 ArrayBuffer 包含 (1,2,3) 六次,而不是顯示所有排列。我相信元素沒有被交換。我在這里做錯了什么?非常感謝您的幫助。
uj5u.com熱心網友回復:
Array
(與ArrayBuffer
) 在 scala 中是可變的。當您這樣做時result.append(arr)
,您會將同一陣列的參考添加到result
. 當arr
接著被修改時,修改可以在的所有元素被觀察result
。
解決您的代碼的一種方法是更換的所有實體result.append(arr)
用result.append(arr.clone())
。
這是正確的,但效率不高。另一種稍微更有效的方法是使用Vector[Int]
而不是ArrayBuffer
,它是不可變的并使用結構共享來執行更有效的更新。
另請參閱如何使用 Scala 更新不可變陣列中的特定元素
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/327827.html
下一篇:基于另一列范圍的子集中值的排名