最近看到一个有意思的题目:波斯公主选驸马链接 ,手痒想写代码模拟实现一
下。正好在做scala的项目,自然就想用scala来实现。
模型里首先要实现一个”洗牌算法” ,该算法用java实现的话如下:
void MySwap(int &x, int &y)
{
int temp = x;
x = y;
y = temp;
}
void Shuffle(int n)
{
for(int i=n-1; i>=1; i--)
{
MySwap(num[i], num[rand()%(i+1)]);
}
}
很简单,利用java的引用就可以用Myswap函数来交换两者的值,但是这在scala里是行不通的,scala函数只接受val,也就是常量。
怎么办呢?想到了scala里Array的特性:本身是常量,但其元素可以修改,于是实现代码:
def swap(arr:Array[Int],a:Int,b:Int)={
val tmp = arr(a)
arr(a)=arr(b)
arr(b)=tmp
}
def shuffle(arr:Array[Int])={
val t = new Random()
for(i <- (1 to arr.length-1).toArray.reverse)
swap(arr,i,t.nextInt(i+1))
}
之后,用一个 val arr = (0 to 99).toArray 带入函数shuffle中即可