Пишем код: как поменять местами значения переменных

Эта зада­ча — мини-практика для тех, кто уже осво­ил­ся в про­грам­ми­ро­ва­нии и хочет попро­бо­вать свои силы в реше­нии насто­я­щих задач. 

Пред­ставь­те такое: вы пише­те код для бре­ло­ка от управ­ле­ния охра­ной все­го дома. Памя­ти в таких бре­ло­ках мало, каж­дый байт на вес золо­та. Ваша зада­ча — поме­нять места­ми чис­ло­вые зна­че­ния в двух переменных:

  • Напри­мер, в пере­мен­ной A хра­нит­ся чис­ло 3, а в пере­мен­ной B — чис­ло 5.
  • Нуж­но сде­лать так, что­бы в A ока­за­лось 5, а в B — 3.

Как это сде­лать, если мож­но исполь­зо­вать толь­ко эти две пере­мен­ные? Тре­тью вре­мен­ную пере­мен­ную исполь­зо­вать нель­зя, что­бы не зани­мать лиш­нюю память.

Решение

Те, кто толь­ко начи­на­ют осва­и­вать про­грам­ми­ро­ва­ние, могут напи­сать такой код:

A = B;

B = A; 

Но мы с вами уже сра­зу видим, в чём здесь ошиб­ка: как толь­ко мы напи­шем A = B, то мы поте­ря­ем зна­че­ние пере­мен­ной A. Дело в том, что после тако­го при­сва­и­ва­ния зна­че­ние B будет лежать в обе­их пере­мен­ных, и зна­че­ние A будет уже недо­ступ­но. Для про­вер­ки запу­стим код в браузере:

var a = 3;
var b = 5; 
console.log("До перестановки: a = " + a + ", b= " + b );
a = b;
b = a;
console.log("После перестановки: a = " + a + ", b= " + b );
Пишем код: как поменять местами значения переменных

Вид­но, что зна­че­ние пере­мен­ной A поте­ря­лось и у нас теперь два оди­на­ко­вых зна­че­ния B.

Наша зада­ча — где-то хра­нить одно­вре­мен­но и A и B, что­бы мож­но было раз­ло­жить их по нуж­ным пере­мен­ным. Про­ве­рим, сра­бо­та­ет ли этот под­ход, если у нас все­го две переменные.

Поло­жим в пере­мен­ную A сум­му A и B:

A = A + B; // теперь у нас в A лежит сум­ма, а B по-прежнему хра­нит своё значение.

Теперь сде­ла­ем хит­рость: поло­жим в B началь­ное зна­че­ние A. Полу­чить его про­сто — доста­точ­но из сум­мы, кото­рая сей­час хра­нит­ся в A, вычесть B:

B = A − B; // сей­час в B появи­лось ста­рое зна­че­ние A, кото­рое мы полу­чи­ли вычи­та­ни­ем из обще­го результата.

Нам оста­лось вер­нуть ста­рое зна­че­ние B. Но раз у нас есть их сум­ма и уже гото­вое зна­че­ние A, мы можем про­сто вычесть его из сум­мы и полу­чить B:

A = A − B; // в A появи­лось ста­рое зна­че­ние B, кото­рое мы полу­чи­ли из пер­во­на­чаль­ной суммы.

Про­ве­рим наш код в браузере:

var a = 3;
var b = 5; 
console.log("До перестановки: a = " + a + ", b= " + b );
a = a + b;  // теперь у нас в A лежит сумма, а B по-прежнему хранит своё значение
b = a - b; // сейчас в B появилось старое значение A, которое мы получили вычитанием из общего результата
a = a - b// в A появилось старое значение B, которое мы получили из первоначальной суммы
console.log("После перестановки: a = " + a + ", b= " + b );

Пишем код: как поменять местами значения переменных Работает! 

В сле­ду­ю­щий раз попро­бу­ем зада­чу послож­нее, а пока попро­буй­те сде­лать то же самое, но не исполь­зуя сло­же­ние и вычи­та­ние. И помни­те, что памя­ти в бре­ло­ке мало, дру­гие пере­мен­ные исполь­зо­вать нельзя.