8.7. РЕКУРСИВНЫЕ ПРОГРАММЫ
465
(Здесь для простоты функция N! при неположительном целом аргументе до-
определена как единица).
Выполнение рекурсивных программ проще всего пояснить, отслеживая
процесс вычислений и сопоставляя его с процессом вычислений по итера-
тивной схеме. В рассматриваемом примере сопоставляются два способа вы-
числения N! при N, равном четырем.
По итеративной схеме произведение 1 ∗ 2 ∗ 3 ∗ 4 вычисляется путем на-
капливания его в переменной
F
.
F
инициализируется единицей, затем при
I
,
равном 2, 3, и 4, увеличивается, соответственно, в 2, 3, и 4 раза (после выпол-
нения оператора
F := F * I
), и, как следствие, становится равной 2, 6 и 24.
I
,
равное 4 — последнее значение, при котором перевычисляется
F
, и именно
при этом значении
I
формируется последнее
F
(равное 24), которое является
результатом выполнения итеративной программы.
По рекурсивной схеме 4! вычисляется как произведение 3! на 4. Если 3!
вычислено, то 4! есть результат умножения этого значения на 4. Таким обра-
зом, чтобы подсчитать 4! по рекурсивной схеме, надо сначала вычислить 3!,
что требует вычисления 2!, для которого требуется предварительно вычи-
слить 1!. Последнее, согласно алгоритму, есть 1, т. к. N , равное 1, меньше,
чем 2. 2! есть 1! (уже вычисленное и равное 1), умноженное на 2. 3! — это
произведение 2 ∗3, где 2 = 2! = (3 −1)!, а 3 — величина N, использованная
при вызове алгоритма для нахождения 3!. Наконец, коль скоро 3! получено,
можно продолжить вычисление 4! как 3! ∗ N при N = 4.
8.7.1. Сопоставление итеративной и рекурсивной схем
Главная цель сопоставления двух схем программирования заключается в
решении вопроса о том, когда в реальных программах использовать ту или
иную из них. Можно показать, что любой итеративный алгоритм допускает
трансформацию в рекурсивный и наоборот с сохранением вычислительной
эквивалентности. Любое математическое утверждение об эквивалентности
или об изоморфизме структур не следует понимать буквально: будто бы вы-
бор схемы или структуры данных непринципиален. Как правило, трансфор-
мации, предоставляемые доказательством эквивалентности, могут оказаться
сложными, к тому же они никак не учитывают заботы о модифицируемости
и чаще всего абстрагируются от вопросов сложности вычислений. Поэтому
для практического программирования весьма важно знать теоретические ре-
зультаты об эквивалентности либо изоморфности, но интерпретировать их