Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на Pascal / Delphi / Лекции по Turbo Pascal [22].pdf
Скачиваний:
82
Добавлен:
02.05.2014
Размер:
536.84 Кб
Скачать

Одесский колледж компьютерных технологий “СЕРВЕР”

Рекурсия.

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

Рассмотрим для примера вычисление факториала числа N. Обычно его определяют как произведение всех целых чисел от 1 до N. Его легко вычислить следующим образом:

Var N,i,fact: integer; Begin

Readln (N); fact:=1;

For i:=1 to N do fact:=fact*i; Writeln (fact);

Readln End.

Но существует определение факториала через (N-1)!:

 

0!=1

 

N != N * (N 1)!

при N >0

Программа, использующая рекурсивную функцию, имеет вид:

Var f , N : integer; Function Fact(i:integer); begin

If i=0 then Fact:=1

Else Fact:=i * Fact(i-1); End;

Begin Readln(N); F:=Fact(n); Writeln(f); Readln; End.

9

Одесский колледж компьютерных технологий “СЕРВЕР”

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

Главное требование к рекурсивным подпрограммам заключается в том, что вызов рекурсивной подпрограммы должен производиться по условию, которое на каком-то уровне рекурсии станет ложным. Если условие истинно, рекурсивный спуск продолжается. Когда оно станет ложным, спуск заканчивается и начинается рекурсивный возврат из всех вызванных на данный момент копий рекурсивной подпрограммы.

Существует 3 разные формы рекурсии:

1.С выполнением действий до рекурсивного вызова: Procedure rec;

Begin S;

If условие then rec; End;

2.С выполнением действий после рекурсивного вызова: Procedure rec;

Begin

If условие then rec; S;

End;

3.С выполнением действий как до, так и после рекурсивного вызова:

Procedure rec;

Begin

10