Scala: напишите функцию для замены числа на месте без использования временных переменных

#scala

#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 оба являются неизменяемыми, если я не ошибаюсь?

Комментарии:

1. Почему вы хотите это сделать. Что вы пробовали?

2. Вопрос был задан в книге «Cracking the Coding Interview», и я пытался сделать это в Scala.

3. Если решение означает, что a получает b значение, а b получает a значение, то a и b не являются неизменяемыми. Если переменные изменчивы, тогда найдите XOR swap .

4. Итак, ваш вопрос действительно таков: «как получить изменяемые параметры», и ответ таков: «JVM этого не позволяет».

5. Это невозможно с временными переменными. Это невозможно, точка. Если значения a и b должны изменяться, то они, по определению, изменчивы, и это означает, что они не могут быть принятыми параметрами.

Ответ №1:

Ваше решение для C не самое лучшее, потому что оно может вызвать переполнение целого числа, если a или b достаточно велико.

Правильным решением было бы использовать xor :

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

Но такой трюк имеет смысл, только если переменные изменяемы, поэтому в вашей версии Scala вам пришлось бы переназначить параметры функции на vars.

Другая проблема заключается в том, что вы никогда не должны делать это в производственном коде. Этот алгоритм называется xor swap и был полезен на некоторых ранних процессорах, но сейчас он бесполезен. Это не дает вам никакой выгоды в плане повышения производительности и менее читаемо, чем простое использование временной переменной.

Комментарии:

1. Ваш ответ основан на C , но мне это нужно в Scala без использования каких-либо временных переменных.

2. Вы не можете этого сделать, если переменные не являются изменяемыми. Если они изменяемы, вы можете просто сделать это как в C .

Ответ №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. Я думаю, что вопрос не применим к Scala.