Рекурсия не всегда может быть заменена итерацией.

Любой итеративный цикл может быть заменен рекурсией.

 

Большая часть всех шуток о рекурсии касается бесконечной рекурсии, в которой нет условия выхода, например, известно высказывание: «чтобы понять рекурсию, нужно сначала понять рекурсию».

 

В действительности итерация и рекурсия взаимозаменяемы.

Пример:


function fact (n: integer): longint;

begin

if n=0 then fact:=1

else fact:=n*fact(n-1);

end;

begin

f:=1;

for i:=1 to n do

f:=f*i;

end.


Оба алгоритма имеют линейную сложность, но для рекурсивной процедуры требуются дополнительные расходы памяти и времени, т.к. происходит многократное обращение из подпрограммы к самой себе. Должно создаваться и сохраняться много копий регистров, переменных и точек возврата.

Для хранения этой информации используется стековая память, поэтому в данном случае предпочтительнее итерационная форма.

 

Реализуем вычисление факториала, как в виде функции, так и в виде процедуры на языке Pascal.

 

{Функция на Pascal}

Function Factorial(N:integer): longint;

Begin

If N<=1

Then Factorial:=1

Else Factorial:=Factorial(N-1)*N

End;

{Процедура на Pascal}

Procedure Factorial(N:integer; Var F:longint);

Begin

If N<=1

Then F:=1

Else Begin Factorial(N-1, F); F:=F*N End

End;

Пример вызова из основной программы:

x:= Fact(a);
writeln( a, ‘!= ', x);
Factorial(a, F);
writeln( a, ' != ', F);

Результат 5!= 120
5!= 120