|
Автор: Пьянков Денис ИТП-3-08 |
|
|
Рекурсивная функция – это функция, которая вызывает сама себя. Такой вызов функции может произойти, если функция, выполнение которой еще не закончилось, вызывается снова. Существуют классы алгоритмов, запись которых с помощью рекурсивных функций является более компактной. Пример программы с рекурсивной функцией, которая вычисляет n-число Фибоначчи. Последовательность чисел Фибоначчи: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …начинается с 0 и 1, а каждое следующее число является суммой двух предыдущих чисел. Числа этой последовательности обозначаются через Fn и формально определяются следующим образом: F0 = 0, F1 = 1, Fn = Fn-1 + Fn-2, n >= 2 В пределе отношение Fn / Fn-1 стремится к значению 1.618033… Это значение называется золотым сеченим или божественной пропорцией. Принято считать, что объекты, содержащие в себе золотое сечение, воспринимаются людьми как наиболее гармоничные. #include <iostream.h>
#include <conio.h>
//Рекурсивная функция вычисления n-го числа Фибоначчи
int fib(int n)
{
if (n == 0 || n == 1) //ветвь выхода из рекурсии
{
return n;
}
return fib(n-1) + fib(n-2); //рекурсивный вызов
}
void main()
{
int n;
cout « "n? ";
cin » n;
cout « "fib = " « fib(n);
cout « "f = " « fib(n);
getch();
}
Любую рекурсивную функцию можно заменить нерекурсивным вариантом. Нерекурсивный вариант функции вычисления числа Фибоначчи может быть таким:
int fib(int n)
{
int fnew, fold, foldold; //3 последовательных числа Фибоначчи
if (n == 0 || n == 1) return n;
foldold = 0; fold = 1;
for (int i = 2; i <= n; ++i)
{
fnew = fold + foldold;
foldold = fold;
fold = fnew;
}
return fnew;
}
Недостатки рекурсивных функций:
|