Попробуйте построить на листке бумаги дерево вызовов. Мне делать это лень, но некоторое псевдографическое представление о работе данной процедуры может дать ее модификация таким образом:
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, там как раз рассмотрен случай древовидной рекурсии и дан пример дерева вызовов. Заметьте, что в данной процедуре внутри ее тела, процедура вызывается два раза, т. е. получается именно дерево, а не линейная последовательность вложенных вызовов.
> Рекурсивная процедура вызывает сама себя.
Небо голубое, вода мокрая, ..(© х/ф Последний бойскаут) , а рекурсивная подпрограмма вызывает сама себя.
Почему-то предыдущие ответчики постеснялись упомянуть тот факт, что корректная рекурсивная подпрограмма всегда имеет условие завершения рекурсивного процесса или может иметь даже несколько таких условий.
Другие языки программирования и технологии
Как работает рекурсивная процедура?
Рекурсивная процедура вызывает сама себя.
#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;
}
#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); //здесь процедура вызывает сама себя (с другими параметрами)
...
}
Работу вашей процедуры текстом сложно объяснить. Легче в отладчике посмотреть пошагово.
Рекурсивная процедура в своём теле вызывает сама себя.
procedure AnyCode (Parametr : Integer)
{
...
AnyCode(Parametr); //здесь процедура вызывает сама себя (с другими параметрами)
...
}
Работу вашей процедуры текстом сложно объяснить. Легче в отладчике посмотреть пошагово.
Коля Одуденко
Смотрела, но до конца не поняла. если убрать f(n div 3); то 5 понятно как получается, а дальше не понятно
Похожие вопросы
- Ассемблер рекурсивная процедура. вычисление факториала, в чем проблемма программы? в отладчике она зацикливается.
- Задача в паскале: реализовать рекурсивный алгоритм правильности расстановки скобок
- Не могу понять каким образом работает return в рекурсивной функции?
- Процедуры в PascalABC.NET. Ввод данных
- Процедуры в Pascal
- Теоретический вопрос: "Условие окончания рекурсивного алгоритма". Подскажите пожалуйсто!
- Есть ли фактические параметры в рекурсивной функции? В ней же нет вызова функции?
- Задача по рекурсивному программированию (Паскаль)
- Помогите мне с рекурсивной функцией!
- Задача в паскале: реализовать рекурсивный алгоритм, печатающий все подмножества множества {1,2...N}