Рекурсия

Пример 5:

Следующая программа выдает простые числа от 1 до n, для чего используются функции next и prim, которые вызываются перекрестно, то есть рекурсивно. Одновременно это является примером применения директивы forward.

program primzahlen_rekursiv_berechnen;

{программа рекурсивного вычисления простых чисел}

var n,i : integer;

c : char;

function next(i:integer):integer;forward;

{Это прямая ссылка вперед на функцию next,

которая будет определена позже}

function prim(j:integer):boolean;

{prim имеет значение true, если j простое число,

и false в противном случае}

var k:integer;

begin

k :=2;

while (k*k <= j) and (j mod k < > 0) do

k :=next(k);

{k пробегает последовательность простых чисел, начиная с 2,

вплоть до корня из j, при этом проверяется, делится ли j на

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

следующая функция next}

if j mod k = 0 then prim := false

else prim := true;

end {prim};

function next;

{Параметры уже стоят в ссылке вперед,

next вычисляет, каково следующее за j простое число}

var i:integer;

begin

1 :=i+1;

while not(prim(1)) do 1 :=1+1;

{Итак, next вызывает в свою очередь prim}

next :=1;

end {next};

begin (******* Исполняемая часть программы *******)

write(‘Введите положительное число n,’);

writeln(‘Должны быть определены все’);

writeln(‘предшествующие ему простые числа’);

readln(n);

for i :=2 to n do

begin

if prim(i) then writeln(i:14)

else writeln(i:4);

if i mod 23 = 0 then begin

write(‘<RET>’:60); read(c,c);

end;

end;

end.


Страница: