Игры с Чипом - Мигдал А. А. 3 стр.


— Не знаю, кажется, какой-то ЖЭК. [3]

— Ну, тогда начнем так: «Вот дом, который построил ЖЭК». Твоя очередь, Сережа.

— «Вот квартира сто тридцать,

В которой неладное что-то творится,

В доме, который построил ЖЭК», — сказал Сережа, немного подумав. — Твой ход, Чип.

— Э... э, назови-ка мне какое-нибудь имя девочки.

— Аня, — назвал Сережа имя своей лучшей подруги.

— Ну тогда: «Вот девочка Аня, которая спит у себя на диване,

В квартире и т.д.». Твоя очередь, Сережа. Так что же там неладное творится? Придумывай.

Сережа задумался.

— «Вот комната ванная, в которой море шумит разливанное,

Из крана, забытого девочкой Аней, и т.д.».

— Теперь назови мужское имя, — попросил Чип.

— Мужское? Пожалуйста: Никита.

— «Вот слесарь Никита по лестнице мокрой шагает сердито:

Спешит он в ту комнату ванную и т.д.», — не задумываясь, выпалил Чип.

— Ладно, сдаюсь! — со смехом сказал Сережа.

— А теперь, — сказал Чип вкрадчиво, — как ты, наверно, догадался, мы сделаем из этого стишка программу.

— Подумаешь, легкота! Мы такое уже делали.

— Вот как? Ну, попробуй напиши программу хотя бы для первых трех куплетов.

Сережа взялся за дело и довольно скоро понял, что тут что-то не то. В старых сказках-программах повторялись едоки или жильцы, то есть отдельные слова. А тут повторялись целые куплеты, да еще при этом менялись падежи слов внутри куплетов.

— Что, не тянется репка? — посочувствовал Чип. — А помнишь, мы с тобой про попа и собаку подпрограмму сочиняли? [4] Там ведь можно было выбрать любое слово: «поцеловал», «наказал» — и вставить его внутрь подпрограммы. Вот так и здесь надо. Например:

Выделенное слово ДОМ будет склоняться так, как тебе нужно: дом, доме, домом и так далее.

— Видишь, — продолжал Чип, — тут в кавычках написано слово «ДОМЕ». Это значит, что вместо него надо вставить подпрограмму «ДОМ», то есть написать: «в доме, который построил ЖЭК». Ну, а дальше так же.

На этот раз вызывается подпрограмма «КВАРТИРА», то есть: «квартире 130, в которой неладное что-то творится в «доме». Обрати внимание, что подпрограмма «КВАРТИРА», в свою очередь, вызывает подпрограмму «ДОМ». Понятно?

— Вроде да, — сказал Сережа неуверенно, только я не понимаю, зачем все время пишется слово «возврат» в конце подпрограммы. 

— А как же, это значит, что надо вернуться к тому месту, откуда вызывалась подпрограмма, и продолжать дальше. Например, после того, как закончится подпрограмма «ДОМ», надо продолжать подпрограмму «КВАРТИРА», а когда она закончится, надо продолжать подпрограмму «ДЕВОЧКА АНЯ». Ну как, сможешь дальше сам?

— Попробую. — ответил Сережа и скоро написал:

— Правильно, — похвалил Чип. — А вот, наконец, последняя подпрограмма.

— А все стихотворение можно записать так, — сказал Чип:

Можешь проверить, расписав каждую подпрограмму.

Новая игра

Многие мальчики и девочки спрашивают в письмах Чипа: не знает ли он игры, в которую можно поиграть на самом простом калькуляторе?

Знает Чип такие игры. Вот одна из них:

А «ТЯНУТЬ СЕБЯ ЗА ВОЛОСЫ» — это подпрограмма.

— Ну, а как же эта подпрограмма поможет Мюнхгаузену вылезти из лужи? — спросил Сережа с подозрением.

— А вот как: Мюнхгаузен первый раз потянет себя за волосы и нагреет своими движениями лужу на одну тысячную часть градуса. Потом, если лужа не высохла (а она, конечно, и не подумала высохнуть, хоть чуть-чуть и нагрелась), он снова потянет и нагреет лужу еще на одну тысячную часть градуса и так далее. Если у Мюнхгаузена скорость работы, как у рядового компьютера, то не пройдет и секунды, как вода в луже поднимается до 100°С и закипит. Ну, а из кипятка-то, я думаю, он и сам не заметит, как выпрыгнет!

— Здорово, — восхищенно протянул Сережа. — Слушай, а я как-то и не понимал, что компьютеры так быстро работают. В одну секунду: раз — буль-буль — и прыг! Готово дело!

— А ты заметил другое, что моя подпрограмма вызывает сама себя, как и Мюнхгаузен сам себя за волосы тащит? И не просто себя вызывает. Если бы она только себя вызывала и больше ничего не делала, то получился бы бесконечный цикл, как в стишке про попа и собаку. Но она при каждом вызове чуть нагревает лужу, так что рано или поздно лужа испарится и цикл закончится.

Такие подпрограммы называются рекурсивными, их всегда трудно понять. Кажется, что они не смогут работать, как Мюнхгаузен не сможет вытянуть себя из лужи. Для того, чтобы рекурсивная подпрограмма работала, надо, чтобы при каждом вызове что-то изменялось так, чтобы работа могла кончиться.

— А можешь еще рекурсивную программу написать? Мне очень понравилось.

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

— Постой, постой, дай я соображу, как она будет работать. Если в колонне всего один человек, то его нечего перестраивать. Правильно, тут и написано «возврат». А куда возврат? Ладно, пока это неважно, а там посмотрим.

Теперь пусть в колонне два человека. Идем по программе. Первая строчка не для нас, поскольку в колонне два человека. Смотрим следующую строчку. Первый делает шаг вбок — это мы выполнили вторую строчку. Согласно третьей строчке, мы должны перестроить остаток колонны, то есть последнего, второго. Это мы уже умеем — он остается на месте, и происходит какой-то возврат. Чип, а что это за возврат?

— Ну, сам подумай, что ты должен сейчас делать? Вспомни, что ты делал до того, как прочел таинственное слово «возврат», и...

Но тут вспомнил, как Чип объяснял ему: «Если внутри программы что-то меняется, то это уже не программа, а подпрограмма».

«У нас же число поросят будет меняться», — подумал Сережа, зачеркнул первую строчку и написал вот что:

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

— Ну, а что у тебя? — поинтересовался Сережа.

— А у меня конкурс для твоих поросят.

— Конкурс? Какой конкурс?

— Ну, скажем, по пению. Они песенки поют? Вот мы и проверим, кто лучше поет.

— Ага, — Сережа задумался, — это похоже на перестройку колонны, которую мы делали в прошлый раз. Сейчас я вспомню. Значит, сначала мы поросят будем поочередно отводить в сторону, потом начнем с конца: объявим последнего лауреатом, сравним его с предпоследним, и так до самого первого. Вспомнил, вспомнил! Знаешь, Чип, а это несправедливо: последнему дали побыть лауреатом, даже не проверяя, как он поет. А бедненький первый, даже если он по пению на втором месте, ни разу лауреатом не был.

Назад Дальше