Объясните, что такое Рекурсия?

Rolion

,

Хороший пример рекурсии - это написание функции для удаления каталога со всем его содержимым .

Удалить можно только пустой каталог. Как удалить файлы из каталога, это понятно, но как быть, если в каталоге содержатся другие каталоги, со своими файлами и каталогами? Нужно будет удалить и их, предварительно очистив.

Вот пример из интернета

DelphiВыделить код

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

{ Удалить каталог со всем содержимым }
function DeleteDir(Dir : string) : boolean;
Var
Found : integer;
SearchRec : TSearchRec;
begin
result:=false;
if IOResult<>0 then ;
ChDir(Dir);
if IOResult<>0 then begin
ShowMessage('Не могу войти в каталог: '+Dir); exit;
end;
Found := FindFirst('.', faAnyFile, SearchRec);
while Found = 0 do
begin
if (SearchRec.Name<>'.')and(SearchRec.Name<>'..') then
if (SearchRec.Attr and faDirectory)<>0 then begin
if not DeleteDir(SearchRec.Name) then exit;
end else
if not DeleteFile(SearchRec.Name) then begin
ShowMessage('Не могу удалить файл: '+SearchRec.Name); exit;
end;
Found := FindNext(SearchRec);
end;
FindClose(SearchRec);
ChDir('..'); RmDir(Dir);
result:=IOResult=0;
end;

Суть в том, что функция перебирает содержимое папки. Если встречается файл, то он удаляется.

Если встречается другой каталог, то

функция запускает сама себя

еще раз и работает уже с этим каталогом.

Получается, что в этот момент как бы параллельно будут работать две функции с одинаковым именем и телом. Но, первая будет ждать, когда закончит работу вторая, и только потом продолжит свое действие. Таких рекурсий может быть запущено много. Каждая из них будет ждать, когда закончит работу рекурсия, запущенная после нее.

Такой, своеобразный клубок