N : Byte;
I : Byte;
Z : Word;
Procedure PrintRez;
Var I : Byte;
Begin
For I:=1 To N Do
If D[I]='+' Then Write(A[I],' ');
WriteLn;
End;
Procedure Poisk(K:Byte;S:Integer);
Var I : Byte;
Begin
If S+A[K]<=Z Then Begin
S:=S+A[K];
D[K]:='+';
If S=Z Then PrintRez
Else For I:=K+1 To N Do Poisk(I,S);
S:=S-A[K];
D[K]:=' ';
End;
End;
Begin
Write('Кол-во членов последовательности '); ReadLn(N);
For I:=1 To N Do
Begin
WriteLn('Введите ',I,'-ый член последовательности');
ReadLn(A[I]);
D[I]:=' ';
End;
Write('Z=');ReadLn(Z);
For I:=1 To N Do Poisk(I,0);
End.
Дополнительно. Задача о Ханойских башнях
Ханойские башни – это классическая задача на использование рекурсии.
17
A B C
На площадке A находится пирамида из дисков разного размера. Требуется перенести её на площадку B в том же виде, соблюдая следующие правила:
∙перекладывать можно только по одному диску, взятому сверху пирамиды,
∙класть диск можно только на основание площадки, либо на диск большего размера,
∙площадка C является вспомогательной
Алгоритм переноса:
1.Если N=0, то ничего не делать.
2.Если N>0, то
-перенести N-1 диск на C через B,
-диск A перенести на B через С,
-переместить N-1 диск на B через A.
При выполнении пункта 2 будет три состояния пирамид:
18
Построим программу на Паскале с использованием рекурсивной процедуры Hanoi и фактических имён площадок 1,2,3.
Program Monah; Var N: byte;
Procedure Hanoy(N:byte; A,B,C: char); begin
if N>0 then Hanoy(N-1,A,C,B); writeln(A,’=>’,B); Hanoy(N-1,C,B,A)
end; begin
writeln(‘Число дисков’); readln(N); Hanoy(N,’1’,’2’,’3’)
end.
Пусть N=3
Сбор информации по рекурсивному дереву идёт слева направо и сверху вниз. Таким образом, получаем следующий алгоритм переноса:
1->2, 1->3, 2->3, 1->2, 3->1, 3->2, 1->2.
19
Литература
1.Окулов С. М. Программирование в алгоритмах / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2002. — 341 с: ил.
2.http://it.kgsu.ru/Ob_Pas/obpas102.html
20