Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
A.doc
Скачиваний:
36
Добавлен:
09.04.2015
Размер:
5.6 Mб
Скачать

234 Глава 5

Функция record () служит только для фиксации того факта, что она была вызва- на. В результате запуска этого примера получается следующий вывод:

Описание полученных результатов

Статическая переменная count инициализируется нулем и увеличивается в пер- вом же приложении вывода внутри функции. Поскольку операция инкремента пре- фиксная, отображается уже увеличенное значение. То есть оно будет равно 1 при первом вызове, 2 — при втором и так далее. Поскольку переменная count является статической, она продолжает существовать и сохраняет свое значение от одного вы- зова функции до другого.

Остаток функции сосредоточен на обработке окончания числового прилагатель- ного, то есть выборе окончания ' st', ' nd', ' rd1 или 1 th', которое должно быть до- бавлено при отображении count. Эти окончания в английском языке удивительно не- регулярны. (Я вот думаю, 101-й вызов должен отобразить 101st, или все-таки 101th?).

Обратите внимание на оператор return. Поскольку типом возврата функции является void, включение сюда какого-то значения вызовет ошибку компиляции. Вообще в данном конкретном случае указывать оператор return не обязательно, поскольку выход управле- ния за закрывающую скобку тела функции эквивалентен оператору return без значения. Программа должна компилироваться и запускаться без ошибок, даже если не включить в эту функцию return.

Рекурсивные вызовы функции

Когда функция содержит вызов самой себя, такая функция называется рекурсив- ной. Рекурсивный вызов функции может быть непрямым, когда функция f unl вызы- вает функцию fun2, которая в свою очередь, вызывает funl.

Может показаться, что рекурсия — прямой путь к бесконечному циклу, и если вы будете невнимательны, так и случится. Бесконечный цикл заблокирует вашу машину и потребует нажатия комбинации клавиш <Ctrl+Alt+Del>, чтобы прервать программу, а это всегда неприятно. Предпосылкой избегания бесконечных циклов является на- личие в функции некоторого способа, прерывающего процесс.

Если вы не сталкивались с этой техникой ранее, то случаи, когда может пригодить- ся рекурсия, не слишком очевидны. Однако в физике и математике есть много вещей, которые для своего описания или управления предполагают применение рекурсии. Простой пример — факториал целого числа, который для некоторого заданного N ра- вен произведению 1x2x3x...xN. Этот пример очень часто приводится для демонстра- ции рекурсии в действии. Рекурсия также применяется для анализа программы во время процесса компиляции. Однако мы рассмотрим нечто более простое.

Структурная организация программ 235

В начале этой главы (см. Ех5_01 .срр) мы написали функцию возведения значения в целочисленную степень — то есть для вычисления хn. Это эквивалентно х, умножен- ному на себя n раз. Теперь в качестве элементарного примера применения рекурсии мы можем реализовать это в виде рекурсивной функции. Можно также при этом усо- вершенствовать реализацию этой функции, чтобы она могла работать с отрицатель- ными значениями степени, когда х-n эквивалентно 1/хn.

г

Вывод этой программы будет таким:

Описание полученных результатов

Теперь наша функция поддерживает положительные и отрицательные степени х, поэтому первое, что необходимо сделать — проверить, не является ли степень п, в которую нужно возвести х, отрицательной: