Глава 11. Функции________________________________________263

В распоряжении программистов, работающих с Borland C++ 5, находится стек с максимальным размером в 1Mb, в то время, как ранее было доступно только 64Kb. Таким образом, возможна бесперебойная работа рекурсивных функций большой вложенности.

Замечание

Факториал числа n — это результат последовательного перемножения натуральных чисел от 1 до п. В математике он обозначается восклицательным знаком. Таким образом, 5! (читается 5 факториал) вычисляется как 1*2*3*4*5 и равен 120.

Вот пример простой рекурсивной функции для вычисления факториала

1: void Factorial( unsigned long n)

2: (

3: return n > 2 ? n * Factorial( n - 1) : n; •

4: }

Используемая в функции тернарная операция ?: эквивалентна условному оператору

if ( условие)

оператор;

else

оператор;

Слева от ? находится условие, между ? и : (двоеточием) находится выражение, исполняемое при истинности условия, а выражение между : и; (точкой с запятой) возвращает значение, если условие ложно.

Таким образом, 3-ю строку можно интерпретировать так:

если n больше 2

вернуть n умножить на Factorial( n — 1) // вот рекурсия иначе

вернуть n;

Функция завершает свою работу при n меньшем или равном 2. Если изначально n = 5, то функция будет вызвана 4 раза, прежде чем содержимое стека начнет сокращаться. Можете себе представить, сколько раз функция будет вызвана при достаточно больших n прежде, чем процесс повернет в обратную сторону.

! Предупреждение

Предел возможностей этой функции — 12! Факториал 13 примерно равен 6 миллиардам, а тип unsigned long вмещает только 4 миллиарда с небольшим. К сожалению, хотя емкость стека еще далеко не исчерпана, начинает накладывать свои ограничения тип данных (резервы для ошибок просто неизмеримы, не правда ли?).