
- •116 Глава 2
- •2.13. Основы повторения, управляемого счетчиком
- •2.14. Структура повторения for (цикл)
- •120 Глава 2
- •122 Глава 2
- •2.15. Пример использования структуры for
- •124 Глава 2
- •126 Глава 2
- •2.16. Структура множественного выбора switch
- •Глава 2
- •130 Глава 2
- •132 Глава 2
- •2.17. Структура повторения do/while
- •134 Глава 2
- •2.18. Операторы break и continue
- •Глава 2
- •2.19. Логические операции
- •138 Глава 2
- •Глава 2
- •2.21. Заключение по структурному программированию
- •IfcrpyKTypa (единственный выбор)
- •Глава 2
- •Глава 2
- •148 Глава 2
- •Глава 2
- •Глава 2
- •Глава 2
- •156 Глава 2
- •158 Глава 2
- •160 Глава 2
- •2.1. А) следование, выбор и повторение, b) if/else. С) управляемым счет чиком или определенным заранее, d) Метку, сигнал, флаг или лож ный сигнал.
- •162 Глава 2
- •164 Глава 2
- •166 Глава 2
- •168 Глава 2
- •170 Глава 2
- •172 Глава 2
- •174 Глава 2
- •176 Глава 2
- •178 Глава 3
- •Глава 3
- •3.3. Математические библиотечные функции
- •3.4. Функции
- •Глава 3
- •3.5 Определения функций
- •184 Глава 3
- •186 ГлаваЗ
- •3.6. Прототипы функций
- •188 Глава 3
- •3.7. Заголовочные файлы
- •3.8. Генерация случайных чисел
- •Глава 3
- •192 Глава 3
- •194 Глава 3
- •3.9. Пример: азартная игра
- •Глава 3
- •198 Глава 3
- •3.10. Классы памяти
- •200 Глава 3
- •3.11. Правила, определяющие область действия
- •202 Глава 3
- •204 Глава 3
- •3.12 Рекурсия
- •Глава 3
- •6) Значения, возвращаемые после каждого рекурсивного вызова
- •3.13. Пример использования рекурсии: последовательность чисел Фибоначчи
- •Глава 3
- •3.14. Рекурсии или итерации
- •212 Глава 3
- •Глава 3
- •Глава 4
- •Глава 5
- •Глава 6
- •3.15. Функции с пустыми списками параметров
- •214 Глава 3
- •3.16. Встраиваемые функции
3.14. Рекурсии или итерации
В предыдущих разделах мы рассмотрели две функции, которые можно легко реализовать рекурсивно или итеративно. В этом разделе мы сравним эти два подхода и обсудим основания, по которым программист может предпочесть в конкретной ситуации то или иной подход.
Как итерации, так и рекурсии основаны на управляющей структуре: итерации используют структуру повторения, рекурсии используют структуру выбора.
Как итерации, так и рекурсии включают повторение: итерации используют структуру повторения явным образом, рекурсии реализуют повторение посредством повторных вызовов функции. Как итерации, так и рекурсии включают проверку условия окончания: итерации заканчиваются после нарушения условия продолжения цикла, рекурсии заканчиваются после распознавания базовой задачи. Как итерации с повторением, управляемым счетчиком, так и рекурсии постепенно приближаются к моменту своего завершения: в итерациях выполняется изменение счетчика до тех пор, пока он не примет значение, при котором перестает выполняться условие продолжения цикла; в рекурсиях поддерживается процесс создания упрощенной
212 Глава 3
версии исходной задачи до тех пор, пока не будут достигнута базовая задача. Как итерации, так и рекурсии могут оказаться бесконечными: бесконечный итеративный цикл возникает, если условие продолжения цикла никогда не становится ложным; бесконечная рекурсия возникает, когда шаг рекурсии не упрощать исходную задачу таким образом, чтобы она сходилась к базовой. Рекурсия имеет много недостатков. Повторный запуск рекурсивного механизма вызовов функции приводит к росту накладных расходов: к нарастающим затратам процессорного времени или требуемого объема памяти. Каждый рекурсивный вызов приводит к созданию новой копии функции (на самом деле копируются только переменные данной функции); для этого может потребоваться значительная память. Итерации обычно не связаны с функциями, так что в них отсутствуют накладные расходы на повторные вызовы функции и дополнительные затраты памяти. Тогда для чего же применять рекурсию?
Замечание по технике программирования 3.13
Любые задачи, которые можно решить рекурсивно, могут быть решены также и итеративно (нерекурсивно). Обычно рекурсивный подход предпочитают итеративному, если он более естественно отражает задачу и ее результаты, то есть более нагляден и легче отлаживается. Другая причина предпочтения рекурсивного решения состоит в том, что итеративное решение может не быть очевидным.
Совет по повышению эффективности 3.5
Избегайте использования рекурсий в случаях, когда требуется высокая эффективность. Рекурсивные вызовы требуют времени и дополнительных затрат памяти.
Типичная ошибка программирования 3.20
Случайный вызов нерекурсивной функции самой себя либо непосредственно, либо косвенно, через другую функцию.
Большинство учебников по программированию знакомит с рекурсией гораздо позже, чем это сделано в этой книге. Мы считаем, что рекурсия — весьма обширная и сложная тема, так что лучше познакомиться с ней пораньше и распределить ее примеры по всему остальному тексту книги. На рис. 3.17 приведена таблица, содержащая список примеров и упражнений по рекурсии в данной книге.
Давайте посмотрим еще раз на многочисленные советы, которые мы даем в этой книге. Хорошая техника программирования важна. Часто важна и высокая производительность. К несчастью, эти цели часто не совместимы друг с другом. Хорошая техника программирования — это ключевой момент в вопросе управления созданием все более сложных и крупных программных систем. Высокая производительность этих систем — ключ к созданию систем будущего, которые предъявят еще большие требования к аппаратным средствам. Что же важнее?
Замечание по технике программирования 3.14
Функционализация программ в четком иерархическом стиле - свидетельство хорошей техники программирования. Но за все надо платить.
функции
213
Глава
Примеры и упражнения по рекурсии