{
if (value ==1)
return(1);
else
return(value * factorial(value-1));
}
void main(void)
{
int i;
for (i =1; i <= 5; i++)
printf("Факториал от %d равен %d\n", i, factorial(i));
}
Как можно видеть, функция factorial возвращает значение, которое основывается
на результате вызова самой этой функции.
При выполнении этой функции первым делом осуществляется проверка значения
параметра на равенство 1. Если значение равно 1, то функция возвращает 1. В
противном случае, в качестве результата возвращается значение, равное произведению
значения входного параметра и факториала от числа, равного значению параметра минус
1. Например, предположим, что функция вызывается со значением 3. Тогда в качестве
результата функцией будет возвращено 3*factorial(3-1). Обнаруживая в операторе return
вызов функции factorial, компилятор организует повторный вызов, на этот раз со
значением 3-1 или 2. Поскольку значение не равно 1, результатом выполнения функции
будет 2*factorial(2-1). Наконец, при следующем вызове функции значение параметра
равно 1, поэтому в качестве результата вызвавшей программе (функции) возвращается
значение 1.
Рекурсивная функция чем-то похожа на конструкцию цикла в том, что в обоих
случаях должно быть задано условие завершения. Если это не сделано, то функция
никогда не завершится. Для рассмотренной функции вычисления факториала условием
завершения является факториал от 1, который по определению равен 1.
Когда для реализации некоторой задачи функция обращается к самой себе,
говорят, что она выполняет прямую рекурсию. Изучив несколько примеров рекурсивных
функций, можно разобраться и в большинстве других, использующих прямую рекурсию.
Более сложная форма рекурсии, косвенная рекурсия, образуется, когда некоторая
функция (функция А) вызывает другую функцию (функцию В), которая в свою очередь
вызывает первую функцию (функцию А). Поскольку косвенная рекурсия имеет более
сложный код для понимания, следует по возможности избегать использования такого
вида рекурсии.
Встроенные функции
Единственное неудобство при использовании функций состоит в том, что они
увеличивают издержки (увеличивают время выполнения), помещая параметры в стек при
каждом вызове.
Для улучшения производительности за счет уменьшения издержек на вызов
функции вы можете заставить компилятор C++ встроить в программу код функции,
подобно тому, как это делается при замещении макрокоманд.
Используя встроенные (inline) функции, ваши программы остаются удобными для
чтения (читающий программу видит вызов функции), но вы избегаете издержек на вызов
функции, которые вызваны помещением параметров в стек и их последующим
извлечением из стека, а также переходом к телу функции и последующим возвратом из
нее.
Когда вы определяете в своей программе функцию, компилятор C++ переводит
код функции в машинный язык, сохраняя только одну копию инструкций функции внутри
вашей программы. Каждый раз, когда ваша программа вызывает функцию, компилятор
C++ помещает в программу специальные инструкции, которые заносят параметры
функции в стек и затем выполняют переход к инструкциям этой функции. Когда