Scala:编写一个函数来交换数字而不使用临时变量

时间:2019-03-31 22:23:27

标签: scala

编写一个函数来交换数字,而无需在Scala中使用临时变量。函数参数是不可变的,那么如何避免使用临时变量来实现函数呢?

C / C ++中的解决方案是:

void swap(int a, int b) {
    a = a - b;
    b = b + a;
    a = b - a;
    cout << a << " " << b << endl;
}

Scala中的等效解决方案是什么,因为如果我没记错的话,def swap(a: Int, b: Int): Unit中的a和b都是不可变的?

2 个答案:

答案 0 :(得分:2)

正如已经建立的那样,它不能作为方法或函数来完成。您可以 进行的操作是使用构造函数参数创建一个class,该参数可以是可变的。

class Swap(var a:Int, var b:Int) {
  a ^= b
  b ^= a
  a ^= b
  println(s"a:$a, b:$b")
}

现在,每次创建新的Swap实例时,构造函数参数的值都将被交换。

val myswap = new Swap(4, 579)  //sends "a:579, b:4" to STDOUT

一种毫无意义的锻炼。

答案 1 :(得分:1)

您的C ++解决方案不是最佳解决方案,因为如果ab足够大,则可能导致整数溢出。

正确的解决方案是使用xor

a = a ^ b;
b = b ^ a;
a = b ^ a;

但是这种技巧只有在变量是可变的时才有意义,因此在您的Scala版本中,您必须将函数参数重新分配给 vars

另一个问题是,您应该从不在生产代码中执行此操作。 该算法称为enter image description here,在某些早期处理器上很有用,但现在已无用。它没有给您带来更好性能的好处,而且与使用临时变量相比,它的可读性较差。