bash.im ithappens.me zadolba.li
5326

Нереально, но факт

31 января 2011, 09:00

Студенты сдают первую лабораторную по C++, я бегаю принимаю. Их сорок человек, я один, времени всего час, поэтому конвейер и никакого индивидуального подхода. Одна из задач: используя рекурсию, написать функцию, вычисляющую факториал. Студент показывает программу на два или три экрана кода. Разбираться некогда, поэтому предлагаю запустить с мыслью, что сейчас факториал семи окажется равен 143 или вроде того, и со спокойной совестью оставлю студента копаться в этой каше дальше. Но программа считает, и считает совершенно правильно, по крайней мере, для чисел от 1 до 10. Смотрю код. int fktrl(int n, int p)… Собственно, факториал считается через вызов fktrl(n, 0).

— Что такое p?
— Сколько произведений.
— Каких произведений?
— Которые уже есть. А то иначе не работает.

Понятно, думаю, такой безумный вариант я уже видел. Смотрю код дальше. Ничего подобного! Какие-то проверки, сравнения, штук пять разнообразных рекурсивных вызовов — и fktrl(n−1, p), и fktrl(n, p+1), и совсем загадочное fktrl(n−2, 3). Умножений нет вообще, зато есть сложения.

Времени не остаётся. Ставлю студенту плюсик (потом по моим плюсикам проверят только, кто присутствовал, — хотя студенты этого, конечно, не знают, маленькие ещё) и бегу принимать дальше. Но два вопроса меня теперь мучают: как это работало и как такое можно было придумать и отладить?