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

Что делать, если третью переменную использовать нельзя.

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

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

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

  • Например, в переменной 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 );
Пишем код: как поменять местами значения переменных
Работает!

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

Обложка:

Даня Берковский

Корректор:

Ирина Михеева

Вёрстка:

Маша Климентьева

Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию
Вам может быть интересно
Делаем свой таймер на Python
Делаем свой таймер на Python

Код — проще, возможностей — больше.

easy
Подключаем нейросеть к веб-камере
Подключаем нейросеть к веб-камере

Готовьтесь — искусственный интеллект уберёт вас из кадра.

medium
Создаём собственный таймер-напоминалку
Создаём собственный таймер-напоминалку

Таймеров и трекеров полно, но мы сделаем такой, какой нужен именно вам. Это легко.

medium
Как защитить сайт от хулиганских скриптов
Как защитить сайт от хулиганских скриптов

Приключение на 5 минут.

easy
Что означает ошибка OverflowError: Result too large в Python
Что означает ошибка OverflowError: Result too large в Python

Это значит, что результат получается слишком большим, чтобы его можно было обработать обычным способом

easy
Что означает ошибка SyntaxError: missing ) after formal parameters
Что означает ошибка SyntaxError: missing ) after formal parameters

На самом деле это не просто пропущенная скобка.

easy
Что общего у игральных кубиков и нормального распределения
Что общего у игральных кубиков и нормального распределения

Чем больше кубиков — тем идеальнее график

medium
Пишем игру Ним на Python
Пишем игру Ним на Python

Простой проект с продолжением

easy
Тетрис на JavaScript
Тетрис на JavaScript

Стильный и цветной.

medium
medium