Другие языки программирования и технологии

Как работает рекурсивная процедура?

Коля Одуденко
Коля Одуденко
3 036
Попробуйте построить на листке бумаги дерево вызовов. Мне делать это лень, но некоторое псевдографическое представление о работе данной процедуры может дать ее модификация таким образом:

procedure f(n:integer; d: integer);
var
i: integer;
begin
for i := 0 to d do write ('-');
write(' * ', 'вызов f(', n, ')');
if n>0 then
begin
writeln;
f(n-2, d + 1);
f(n div 3, d + 1);
end
else
writeln(' условие n > 0 не выполняется (n = ', n, ') - завершение рекурсии');
end;
begin
f(7, 0);
end.

здесь дополнительный параметр d -- это глубина рекурсии, т. е. количество вложенных вызовов (как матрешка, только в данном случае матрешка не одномерная, а двумерная :-) . Почитайте http://newstar.rinet.ru/~goga/sicp/sicp.pdf параграф 1.2.2, там как раз рассмотрен случай древовидной рекурсии и дан пример дерева вызовов. Заметьте, что в данной процедуре внутри ее тела, процедура вызывается два раза, т. е. получается именно дерево, а не линейная последовательность вложенных вызовов.

> Рекурсивная процедура вызывает сама себя.
Небо голубое, вода мокрая, ..(© х/ф Последний бойскаут) , а рекурсивная подпрограмма вызывает сама себя.

Почему-то предыдущие ответчики постеснялись упомянуть тот факт, что корректная рекурсивная подпрограмма всегда имеет условие завершения рекурсивного процесса или может иметь даже несколько таких условий.
Клим Гладкий
Клим Гладкий
79 027
Лучший ответ
Рекурсивная процедура вызывает сама себя.

#include <Windows.h>

void foo(int x)
{
foo(x+1);
}

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow)
{
foo(7);
return 0;
}
Чтобы понять, что такое рекурсия, надо понять, что такое рекурсия.
Рекурсивная процедура в своём теле вызывает сама себя.

procedure AnyCode (Parametr : Integer)
{
...
AnyCode(Parametr); //здесь процедура вызывает сама себя (с другими параметрами)
...
}

Работу вашей процедуры текстом сложно объяснить. Легче в отладчике посмотреть пошагово.
Коля Одуденко Смотрела, но до конца не поняла. если убрать f(n div 3); то 5 понятно как получается, а дальше не понятно