Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Комплексное пособие Си.pdf
Скачиваний:
57
Добавлен:
12.03.2015
Размер:
1.57 Mб
Скачать

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

Понятие рекурсивной функции

Рекурсивная функция – это функция, в определении которой есть

обращение к себе самой.

 

 

Пример. Допустим, нужно

вычислить

n! (факториал числа n).

Значение n! можно представить как

произведение n на факториал (n-1) :

n! = n*(n-1)!

 

 

(n-1)! = (n-1)*(n-2)!

 

 

 

 

Если описать функцию вычисления n! ,

то для вычисления (n-1)!

функция может вызвать саму себя. При вычислении (n-1)! функция должна вызывать себя, чтобы вычислить (n-2)! , и т.д. Чтобы процесс не был бесконечным, нужно учесть, что 1!=1 и 0!=1.

/* Рекурсивная функция вычисления n! */ float fact (int n)

{if (n<0)

{ puts (“Недопустимый аргумент функции fact”); exit (1); /* завершение выполнения программы */

}

if (n==1 || n==0) return 1; return n*fact(n-1);

}

Пример вызова этой функции:

int k;

scanf (“%d”, &k);

printf (“%d! = %.0f”, k, fact(k));

Посмотрим, как происходит выполнение функции при k=4.

Последовательность рекурсивных

 

обращений:

 

fact (4)

24 Результат

4 * fact (3)

4 * 6

97

3 * fact (2)

3 * 2

2 * fact (1)

2 * 1

1

1

Хотя для этой задачи можно использовать рекурсию, но предпочтительнее нерекурсивный вариант (когда значение факториала числа вычисляется в цикле), т.к. не тратится время на многократные вызовы функции и передачу параметров. Достоинством рекурсивных функций является компактная и, в некоторых случаях, более очевидная запись, что позволяет сократить время разработки алгоритма.

Контрольные вопросы

1.Что такое рекурсия?

2.Что такое косвенная рекурсия?

3.Приведите пример рекурсивной функции.

4.Приведите пример косвенной рекурсии.

5.Можно ли заменить рекурсивную функцию нерекурсивной?

6.Напишите рекурсивную функцию, вычисляющую значение xn

98