- •6 Глава 1
- •12 Глава 1
- •14 Глава 1
- •16 Глава 1
- •18 Глава 1
- •20 Глава 1
- •22 Глава 1
- •24 Глава 1
- •26 Глава 1
- •31 Глава 1
- •34 Глава 2
- •36 Глава 2
- •Puc. 2.4. Дополнительные опции консольного приложения Win32
- •38 Глава 2
- •40 Глава 2
- •42 Глава 2
- •44 Глава 2
- •48 Глава 2
- •50 Глава 2
- •52 Глава 2
- •54 Глава 2
- •56 Глава 2
- •58 Глава 2
- •60 Глава 2
- •62 Глава 2
- •64 Глава 2
- •66 Глава 2
- •68 Глава 2
- •70 Глава 2
- •74 Глава 2
- •76 Глава 2
- •79 Глава 2
- •82 Глава 2
- •84 Глава 2
- •86 Глава 2
- •88 Глава 2
- •92 Глава 2
- •94 Глава 2
- •96 Глава 2
- •98 Глава 2
- •103 Глава 2
- •105 Глава 2
- •107 Глава 2
- •110 Глава 2
- •115 Глава 3
- •119 Глава 3
- •121 Глава 3
- •123 Глава 3
- •125 Глава 3
- •129 Глава 3
- •131 Глава 3
- •133 Глава 3
- •139 Глава 3
- •141 Глава 3
- •143 Глава 3
- •145 Глава 3
- •148 Глава 3
- •150 Глава 3
- •155 Глава 3
- •165 Глава 4
- •168 Глава 4
- •170 Глава 4
- •173 Глава 4
- •175 Глава 4
- •178 Глава 4
- •184 Глава 4
- •186 Глава 4
- •188 Глава 4
- •190 Глава 4
- •192 Глава 4
- •194 Глава 4
- •198 Глава 4
- •201 Глава 5
- •203 Глава 5
- •205 Глава 5
- •207 Глава 5
- •213 Глава 5
- •217 Глава 5
- •219 Глава 5
- •221 Глава 5
- •223 Глава 5
- •225 Глава 5
- •227 Глава 5
- •232 Глава 5
- •234 Глава 5
- •236 Глава 5
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. Этот пример очень часто приводится для демонстра- ции рекурсии в действии. Рекурсия также применяется для анализа программы во время процесса компиляции. Однако мы рассмотрим нечто более простое.
Структурная
организация программ
В начале этой главы (см. Ех5_01 .срр) мы написали функцию возведения значения в целочисленную степень — то есть для вычисления хn. Это эквивалентно х, умножен- ному на себя n раз. Теперь в качестве элементарного примера применения рекурсии мы можем реализовать это в виде рекурсивной функции. Можно также при этом усо- вершенствовать реализацию этой функции, чтобы она могла работать с отрицатель- ными значениями степени, когда х-n эквивалентно 1/хn.
г
Вывод этой программы будет таким:
Описание полученных результатов
Теперь наша функция поддерживает положительные и отрицательные степени х, поэтому первое, что необходимо сделать — проверить, не является ли степень п, в которую нужно возвести х, отрицательной: