Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛекцииЯзыки прогрИб.doc
Скачиваний:
27
Добавлен:
12.11.2019
Размер:
922.11 Кб
Скачать

9.3. Программирование рекурсивных алгоритмов

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

Рекурсивная функция – это функция, которая вызывает сама себя.

Рассмотрим понятие рекурсии на классическом примере – расчете факториала целого числа.

Факториал n! равен n*(n-1)*(n-2)*…*1 ,причем 1!=1 и 0!=1. Пусть надо вычислить 3!=3*2*1, что можно свести к 3*(2!). Рекурсивная задача разбивается на этапы, где вызывается рекурсивная функция, которая вычисляет n*(n-1)!: 3! -> 3*2! -> 2*1! -> 1.

Рекурсивная функция последовательно делит задачу на две части: одну часть (* - умножение) она может решить, а вторую часть ((n-1)!) она не может решить. Для выполнения рекурсии необходимо, чтобы вторая часть была похожа на исходную задачу, но быть несколько меньше. И тогда рекурсивная функция вызывает новую копию самой себя. Это называется рекурсивным вызовом или шагом рекурсии. Процесс рекурсии приводит к формированию все меньших и меньших задач и заканчивается, когда функция достигает базовую задачу (1!=1). Затем функция последовательно возвращает в обратном порядке значения рекурсивных вызовов оператору вызова, пока не будет возвращено окончательное решение: (1) -> (2*1=2) -> (3*2=6).

Пример 7. «Рекурсивные алгоритмы»

Условие задачи: создать рекурсивную функцию вычисления факториала.

Создать проект консольного приложения и ввести имя проекта TPlab2_2.

Создается исходный файл TPlab2_2.cpp, который будет содержать всего одну пустую функцию main():

int t_main(int args, _TCHAR* argv[])

{return 0;}.

Проект должен содержать файл заголовков TPlab2_2.h и файл кодов TPlab2_2.cpp.

Создать файл TPlab2_2.h, ввести текст файла и сохранить его:

//файл заголовков TPlab2_2.h

#include <iostream>

using std::cout;

using std::cin;

using std::endl;

int fact(int);

Добавить в файл кодов TPlab2_2.cpp подключение файла заголовков и текст функции main():

//файл кодов TPlab2_2.cpp

#include "stdafx.h"

#include "TPlab2_2.h"

int _tmain(int argc, _TCHAR* argv[])

{

int res, n;

cout<<"Vvedite celoe chislo: ";

cin>>n;

res=fact(n);

cout<<n<<"!="<<res<<endl;

return 0;

}

int fact(int n)

{

if (n<=1)

return 1;

else

return n*fact(n-1);}

Пусть требуется вычислить 3!. Вызывается функция fact(3). При входе в функцию формальному параметру n присваивается значение фактического параметра 3 и выполняется выражение 3*fact(2), т.е. опять вызывается функция fact для вычисления fact(2). При входе в функцию формальному параметру n присваивается значение 2 и выполняется выражение 2*fact(1), т.е. опять вызывается функция fact для вычисления fact(1). При входе в функцию формальному параметру n присваивается значение 1 и выполняется выражение 1*fact(0), т.е. опять вызывается функция fact для вычисления fact(0). На этом завершается выполнение выражения 1*fact(0), что возвращает значение fact(1)=1; потом завершается выполнение выражения 2*fact(1), что возвращает значение fact(2)=2, и затем завершается вычисление 3*fact(2), что дает искомый результат 3*2=6.

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

  1. Дайте понятие функции.

  2. Что такое определение, прототип и оператор вызова функции?

  3. Зачем нужен прототип функции?

  4. Какие существуют способы передачи параметров функции?

  5. Охарактеризуйте выполнение оператора вызова функции.

  6. Дайте понятие рекурсивной функции.

  7. Объясните понятие шага рекурсии.