- •Тема "Рекурсия". Глава 1. Рекурсия. Основные положения.
- •1.1. Рекурсивные алгоритмы.
- •1.2. Рекурсивные процедуры и функции. Взаиморекурсия.
- •1.3. Фрейм активации.
- •Var a,b,r:integer;
- •Var a,b,r:integer;
- •Var a,b,eps,X:real;
- •Var f,X:real;
- •Var s:string;
- •If f_char(s) then writeln(' Строка корректна')
- •Var s:string;
- •If f_char(s,1) then writeln('Строка корректна')
- •I:integer;
- •Глава 2. Полный и ограниченный перебор. Рекурсия при программировании ограниченного перебора.
- •2.1. Понятие полного перебора. Основные приемы его осуществления.
- •Var I:integer;
- •Var pole:p; I,m:integer;
- •Var I,j:integer;
- •Var I:integer;
- •If New_r(m,pole) then
- •2.2. Использование рекурсии при реализации ограниченного перебора.
- •Var pole:p; k,integer;
- •Var j:integer;
- •Var I:integer;
Var pole:p; k,integer;
function new_r(n:integer;pole:p):boolean;
Var j:integer;
begin new_r:=true;
for j:=1 to n-1 do
if (pole[j]=pole[n]) or (abs(pole[j]-pole[n])=n-j) then
begin new_r:=false;
exit;
end;
end;
procedure ferz(n,m:integer; var pole:p);
Var I:integer;
begin
if n=m+1 then
begin for i:=1 to m do write(pole[i]:2);writeln; end
else
for i:=1 to m do
begin
pole[n]:=i;
if new_r(n,pole) then ferz(n+1,m,pole);
end;
end;
begin writeln('Введите размер доски:');
readln(m);
k:=0;
ferz(1,m,pole);
end.
Процедура new_r используется для проверки уже сгенерированной комбинации (уровеньn соответствует попытке установитьn-го ферзя). Процедураferzрекурсивна. На каждом уровне она может породить доmрекурсивных вызовов (в соответствииc деревом генерации вариантов). Однако общее количество рассматриваемых вариантов резко уменьшается, что можно наглядно видеть по таблице 1.
Таблица 1.
Размер доски |
Всего вариантов |
Рассмотрено вариантов |
Количество решений |
4*4 |
256 |
17 |
2 |
5*5 |
3125 |
54 |
10 |
6*6 |
46656 |
153 |
4 |
7*7 |
823543 |
552 |
40 |
8*8 |
16777216 |
2057 |
92 |
Выводы.
Рекурсию следует использовать тогда, когда рекурсивный алгоритм значительно проще нерекурсивного.
При использовании рекурсии следует обязательно проверять наличие и правильность условия выхода из рекурсии.
Не следует забывать о необходимости оценки размера фрейма активации и соотношения этой оценки с размером стека (с учетов развертывания рекурсии).