
- •Рекурсия
- •Общие положения
- •Виды рекурсии
- •{ Бесконечная рекурсия }
- •Структура программы в оперативной
- •Главное требование к
- •Рекурсивные подпрограммы
- •Внутренний механизм
- •Физическое
- •Основные определения
- •Формы рекурсивных подпрограмм
- •Формы рекурсивных подпрограмм
- •Формы рекурсивных подпрограмм
- •Приклад 1.
- •Приклад 2.
- •Приклад 3.
- •Приклад 4.
- •Приклад 5.
- •Приклад 6.
- •Приклад 7.
- •Приклад: возведення у цілий степінь var a:real;
- •Приклад: Обчислити хn, n 0, ціле за допомогою рекурсії.
- •Алгоритми з поверненням
- •Шахова задача про хід коня
- •Шахова задача про вісім ферзів

Рекурсия
1

Общие положения
Рекурсия — возвращение
Рекурсивные алгоритмы (или алгоритмы с возвратом ) — это алгоритмы, которые используют в качестве вспомогательного (или подчинённого) самого себя
Рекурсия (в программиравании)— это способ организации вычислительного процесса при котором подпрограмма, в ходе выполнения составляющих её операторов, обращается сама к себе (вызывает сама себя)
2

Виды рекурсии
Прямая рекурсия — явное обращение к подпрограмме
Procedure P;
Begin
P;
End;
Косвенная рекурсия — обращение к подпрограмме через цепочку подпрограмм
Procedure А; |
Procedure В; |
Begin |
Begin |
В; |
А; |
End; |
End; |
3

{ Бесконечная рекурсия }
Procedure Prn;
Begin
Writeln ( ‘Привет’ );
Prn
End;
{--------------}
Begin
Prn
End.
Протокол роботи програми.
Привет
Привет
…
…
4

Структура программы в оперативной
памяти
В IBM PC-совместимых |
|
|
|
Динамическая память |
|
|
|
|
компьютерах память |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
условно разделена на |
|
|
|
Сегмент стека |
|
|
|
|
сегменты. |
|
|
|
|
|
|
|
|
|
|
|
Сегмент данных |
|
|
|
||
Адрес каждого байта |
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
составляется из номера |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
сегмента и смещения. |
|
|
|
Сегмент кода |
|
|
|
|
Компилятор формирует |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
сегмент кода, в котором |
|
|
|
16 бит |
4 бита |
|
||
хранится программа в виде |
|
|
|
|
|
|
|
|
машинных команд, и |
|
|
|
|
|
|
|
|
|
|
|
Адрес сегмента |
|
0000 |
|
||
сегмент данных, в |
|
|
|
|
|
|||
+ |
|
|
|
|
|
|
|
|
|
|
16 бит |
|
|
|
|||
котором выделена память |
|
|
|
|
|
|
|
|
под глобальные |
|
|
|
Смещение |
|
|
|
|
|
|
|
|
|
|
|
||
переменные программы. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Физический адрес |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
20 бит |
|
|
|
5

Главное требование к
рекурсивным
подпрограммам
Рекурсивное обращение к подпрограмме должно подчинятся какому –либо условию, которое в какой – то момент времени перестаёт выполнятся ( т.е. организовать выход из рекурсии)
6

Var |
n : integer; |
Procedure Prn ( n : integer);
Begin
If n > 0 then
begin
|
Writeln ( ‘Привет ’, n); |
Prn (n-1);
End;
End;
{--------------}
Begin
n:=3;
Prn (n);
End.
Протокол роботи програми.
Привет 3
Привет 2
Привет 1
7

Рекурсивные подпрограммы
function FTR(n : byte): longint; begin
if (n = 0) or (n = 1) then FTR := 1 else FTR := FTR(n - 1) * n;
end;
----------
A := FTR(4);
стек
n = 1 |
… |
|
|
n = 2 |
… |
|
|
n = 3 |
… |
|
|
n = 4 |
… |
8

Внутренний механизм
рекурсии
Обращение к другому экземпляру этой же подпрограммы (4 шага)
9

Физическое
представление рекурсии
10