Комментарий к «А и В сидели»
Своим студентам я всегда говорю: если задача не решается, то она имеет нуль решений, а если задача решается, то она имеет бесчиcленное множество решений. И они мне верят, потому что это правда.
Но на самом деле верить совсем не обязательно, это утверждение можно проверить самостоятельно, что мы сейчас и сделаем на примере очень простой задачи ( как вы догадались, из текста «А и В сидели» ).
Обычно, когда программисту необходимо совершить обмен значениями для двух переменных, то почти все делают это так:
t = a
a = b
b = t
То есть, для этого используется временная переменная t, которая нужна только для того, чтобы «запомнить» значение переменной a. Так делают почти все. Но как вы уже поняли из «пьесы», то же самое можно делать и по-другому:
a = a + b
b = a – b
a = a – b
Действий становится больше, но зато не нужна временная третья переменная. Иногда для программиста это может быть полезно. Но возможен и такой алгоритм:
a = a – b
b = a + b
a = b – a
Можно сказать, что он в принципе ничем не отличается от предыдущего, но он всё же есть.
А сколько их вообще? Наверно очень много. Вот, например, ещё один:
a = a * b
b = a / b
a = a / b
Если первый способ (с переменной t ) даже считать нулевым, то это уже третий по счёту. Возможно, этот третий и вовсе не нужен, но мы же с вами решили доказать, что решений у этой маленькой конкретной задачи имеется бесчисленное количество. Поэтому придётся продолжать.
Следующий, четвёртый способ просто обязан-таки выглядеть так:
a = a / b
b = a * b
a = b / a
Смысл вы уже наверно поняли: для обмена значений у двух переменных можно использовать все математические действия. Например, возведение в степень:
a = ab
b=a(1/b)
a = log b a
А после маленького пятого алгоритма сразу идёт маленький шестой алгоритм:
a = a * 2b
b = a / 2b
a = log 2 a/b
Можно ли для целей обмена использовать синусы и косинусы, предлагаю проверить вам самостоятельно.
Но мне хочется обратить ваше внимание на то, что переменных, у которых обмениваются значения, может быть тоже неограниченное количество. Например для трёх, среди которых, естетвенно, нет временной, алгоритм может выглядеть вот так:
a = a + b + c
b = a – b – c
c = a – b – c
a = a – b – c
Не правда ли, это красиво? А для четырёх переменных ещё красивей:
a = a + b + c + b
b = a – b – c – d
c = a – b – c – d
d = a – b – c – d
a = a – b – c – d
Если кому-то показалось, что все эти «изыски» совершенно никчёмны и напрасны, то это зря. Программисту надо уметь решать каждую задачу несколькими способами. Впрочем, это нужно уметь не только программисту – это нужно всем хорошим инженерам, строителям, электронщикам, химикам, физикам, портным, кулинарам… и многим другим специалистам. Потому что жизнь часто «загоняет» специалистов в некий «тупик», из которого можно выйти только в том случае, если знаешь несколько решений предлагаемой жизнью задачи. А если кто-то, сидя в тёплой и уютной аудитории, выучил только по одному решению для каждой задачи, то в сложных «погодных» условиях может так получиться, что он не найдёт и одного…
Как видите, маленькая пьеса оказалась весьма поучительной. Впрочем, искусство всегда даёт людям что-то хорошее. Приходите в мой театр ещё!
Павел Сапунов
|