Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл: Источник:
Скачиваний:
111
Добавлен:
04.03.2014
Размер:
185.34 Кб
Скачать

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

Выводы.

  1. Рекурсию следует использовать тогда, когда рекурсивный алгоритм значительно проще нерекурсивного.

  2. При использовании рекурсии следует обязательно проверять наличие и правильность условия выхода из рекурсии.

  3. Не следует забывать о необходимости оценки размера фрейма активации и соотношения этой оценки с размером стека (с учетов развертывания рекурсии).

Соседние файлы в папке Методичка С++