Теперь сдавайте карты, по очереди раскладывая их в две кучки. Делая это, говорите «шиворот», когда кладете карты рубашкой вверх в первую стопку, и «навыворот», когда кладете карты лицом вверх во вторую стопку. Как только все карты будут выложены, сбросьте «шиворот» и отметьте, что вы всегда сбрасываете эту стопку. Возьмите стопку «навыворот», поверните ее рубашкой вверх и повторяйте процесс, каждый раз сбрасывая «шиворот». Продолжайте, пока у вас не останется одна карта из стопки «навыворот», лежащая лицом вверх. Это будет восьмерка червей. Скажите зрителям, что это и есть искомая карта. Попросите добровольца подтвердить, что он не знал заранее, какая карта останется в конце, а также показать и назвать полученную карту. Также попросите его подтвердить, что он разделил колоду исключительно по своему усмотрению. Переверните первые несколько карт в сброшенной стопке и скажите: «Если бы вы сдвинулись даже на одну карту, результат был бы другой».
Теперь укажите вот на какую странную вещь: в вашем сне австралийский маг сказал, что нужно заранее положить в конверт одну конкретную карту. Попросите добровольца посмотреть под столом и достать из конверта карту, предсказанную австралийским магом в вашем сне. Это тоже восьмерка червей!
Поблагодарите добровольца и попросите аудиторию поаплодировать ему.
Хитрые алгоритмы
Какое отношение фокус имеет к информатике? Здесь мы имеем так называемый — именно это в информатике называют Под алгоритмом подразумевается серия инструкций, которая всегда приводит к конкретному желаемому эффекту, если следовать им в заданном порядке. В данном случае — магический эффект: у вас остается именно предсказанная карта. Компьютерные программы — всего лишь алгоритмы, написанные на языке, который скорее поймет компьютер, чем фокусник. С их помощью программист добивается, чтобы программа выполняла задуманные им действия.
Алгоритм, лежащий в основе «Сна об австралийском маге», показан на рис. 5.
Этот конкретный алгоритм содержит не только шаги, которые надо выполнять последовательно. В нем есть циклы, например «повторите 4 раза». Цикл показывает, что некоторые инструкции надо повторить. Он позволяет не писать одно и то же много раз. Именно такие инструкции программисты используют в компьютерных программах, чтобы компьютер повторил какие-то указания. Есть и второй цикл: «Повторите, пока не останется карт». Этот цикл воспроизводится 4 раза, как указано в первом цикле. Каждый раз вы проходите через всю колоду, оставляя и сбрасывая карты, пока не останется ни одной.
Придумываем фокусы
Чтобы придумать новый трюк, фокусник должен использовать тот же тип мышления, что и ученый-информатик, — а именно вычислительное мышление. Карточный фокус подразумевает вычисления, только они проводятся с помощью колоды карт вместо компьютера. Чтобы изобрести новый фокус, необходимо . Фокусник должен продумать серию шагов, которые можно повторить и получить магический эффект. Ему абсолютно необходимо, чтобы фокус получался . Он не хочет глупо выглядеть на сцене, и поэтому нужно продумать все до мельчайших деталей. Необходимо удостовериться, что шаги должны делаться именно в указанной последовательности. Как и в программировании, нужно продумать каждый возможный вариант. Может ли доброволец как-то помешать выполнению фокуса? Если да, нужно знать, что делать в этом случае. Кроме того, следует достаточно точно записать все действия, чтобы в будущем сам фокусник или кто-то другой смог повторить их и успешно показать фокус (хотя маги, в отличие от ученых-информатиков, не склонны раскрывать свои секреты!). Все это — в действии.
Главное здесь в том, что, как только маг изобрел свой трюк и записал алгоритм (возможно, рунами!), всякий, кто знает этот алгоритм, в состоянии показать фокус. Для этого не придется ничего изобретать. Надо просто четко следовать инструкциям. Ученик чародея может показать фокус, даже если ему абсолютно не понятно, как он работает. Правильно и точно выполните необходимые действия — и получите задуманный волшебный эффект.
Почему это важно для информатики? Именно так мы добиваемся, чтобы работал компьютер. Компьютеры — это куски металла и кремния. Они не понимают, что делают. Просто слепо следуют инструкциям, как ученик колдуна. Программисты делают всю творческую работу, составляя инструкции. Для программирования важен навык писать инструкции очень точно и недвусмысленно, чтобы не допустить несоответствий. Цель каждой инструкции не должна вызывать никаких сомнений: компьютер должен в точности следовать указаниям. Каждый возможный исход событий должен быть описан в инструкции — компьютер не справится с непредвиденным. Однако, следуя этим указаниям, компьютер может творить чудеса (и даже казаться разумным, как мы увидим далее).