#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.