Глава 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 миллиарда с небольшим. К сожалению, хотя емкость стека еще далеко не исчерпана, начинает накладывать свои ограничения тип данных (резервы для ошибок просто неизмеримы, не правда ли?).