Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика_и_Пр_Бизнес_лекции.doc
Скачиваний:
84
Добавлен:
10.05.2015
Размер:
1.21 Mб
Скачать

8.7. Рекурсивные функции

Рекурсивная функция – это функция, которая вызывает сама себя. Такой вызов функции может произойти, если функция, выполнение которой еще не закончилось, вызывается снова. Существуют классы алгоритмов, запись которых с помощью рекурсивных функций является более компактной.

Пример программы с рекурсивной функцией, которая вычисляет 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;

}

Недостатки рекурсивных функций:

  1. Увеличение памяти на повторные вызовы функции и многократное размещение в стеке формальных параметров и локальных переменных рекурсивной функции.

  2. Расход времени на многократное выполнение команд вызова функции.

  3. Переполнение стека программы, при большом количестве рекурсивных вызовов.

8.8. Функции с параметрами по умолчанию

В С++ для того, чтобы упростить вызов функции с наиболее часто используемыми входными значениями, в заголовке функции используются параметры по умолчанию. Параметр по умолчанию – это значение, которое используется в качестве аргумента функции, если при вызове функции аргумент не указан. Для задания в функции параметра по умолчанию, надо в заголовке функции объявить формальный параметр с начальным значением. Функция может иметь несколько параметров умолчания, но они должны находиться в конце списка формальных параметров.

Пример программы, в которой используется функция поиска позиции первого вхождения заданного числа в массив, начиная с некоторой начальной позиции. Так как наиболее часто требуется найти первое вхождение заданного числа в массив, то в заголовке функции используется параметр умолчания, задающий значение начальной позиции поиска вхождения равное нулю.

#include <iostream.h>

#include <conio.h>

//Функция поиска первого вхождения значения х в массив из

//n целых чисел начиная с позиции p

int pos (int a[], int n, int x, int p=0);

void main()

{

int a[100], n, x, p;

int number; //номер первого числа массива со значением х (или -1)

cout<<"n? "; cin>>n;

cout<<”a: ”;

for (int i=0; i<n; i++)

cin>>a[i];

cout<<"x? "; cin>>x;

number= pos(b,n,x); //по умолчанию поиск начинается с 0-позиции

if (number==-1)

cout<<”No”<<endl;

else

cout<<"number_0="<<number<<endl;

number=pos(b,n,x,3); // поиск начинается с 3-позиции

if (number==-1)

cout<<”No”<<endl;

else

cout<<"number_3="<<number;

getch();

}

int pos (int a[], int n, int x, int p)

{for (int i=p; i<n; i++)

if(a[i]==x)

return i; //возврат номера элемента

return -1; //возврат признака отсутствия вхождения элемента

}

Тесты:

а: 8 9 5 2 1 9 10, n=7, x=9, p=0 результат: number=1

а: 8 9 5 2 1 9 10, n=7, x=9, p=3 результат: number=5

а: 8 9 5 2 1 9 10, n=7, x=4, p=0 результат: number =-1

В программе функция pos вызывалась два раза: первый раз с 3 аргументами (использовалось значение умолчания), второй – с 4 аргументами.

Ограничения на использование параметров по умолчанию:

  • параметры со значениями по умолчанию должны быть последними в списке формальных параметров;

  • если параметров по умолчанию несколько, то при вызове можно не указывать все параметры умолчания или только последние из них;

  • инициализация параметров по умолчанию должна выполняться в первом заголовке функции (в прототипе или в определении функции) и только один раз.