Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Рекурсия


Автор: <Spawn> 9.6.2003, 13:56
Работаю с древовидными структурами данных. И вот пришла мысль, что для этих целей вроде бы хорошо использовать рекурсию (например, для навигации по данным). Но вот проблемка - я ни когда еще не использовал ее. Пожалста, подскажите в чем ее смысл.

Автор: eof 9.6.2003, 14:20
процедура (функция) вызывает сама себя. например:

function GetAllChildCount(AItem: TTreeNode): Integer;
begin
Result := AItem.Count;
for i := 0 to Result - 1 do
Result := Result + GetAllChildCount(AItem.Item[i]);
end;

Примерно так может выглядеть рекурсивная функция для расчета количества всех "детей" узла дерева.

надеюсь все правильно...

Автор: dm9 9.6.2003, 15:42
Наглядный пример - удаление каталога со всем содержимым

http://www.delphimaster.ru/cgi-bin/faq.pl?look=1&id=988622376&n=15

Автор: Kesh 10.6.2003, 08:56
То, что помню из лекций...
1. Рекурсия не есть гуд... Но для обхода дерева - самое то...
2. Рекурсивная процедура обычно состоит из 2-х частей:
а. Проверка некоего условия...
б. Выполнение повторяющегося действия
Например, если у тебя в дереве у каждого корня по 3 отростка, то поиск будет такой...

Код

type
 PTree = ^TTRee;
 TTree = record
   Left, Center, Right: PTree;
   Info: TInfo
 end;

procedure RunTree(var Brunch: PTree);
begin
 if Brunch=nil then Exit;
// Здесь идет обработка узла, например: OutInfo(Brunch.Info);
 RunTree(Brunch.Left);
 RunTree(Brunch.Center);
 RunTree(Brunch.Right);
end;

Если что непонятно будет, пиши...

Автор: Song 10.6.2003, 14:01
Печать ветви на принтер с помощью рекурсии:

Procedure PrintNode(Node: TTreeNode);
Var t: Integer;
Begin
WriteLn(ff,StringOfChar(#9,Node.Level-Tree.Selected.Level)+Node.Text);
With Tree Do For t:=0 to Node.Count-1 Do PrintNode(Node[t]);
End;
...
PrintNode(Tree.Selected);
...

Ну то, что надо AssignPrn и т.д. делать, думаю, понятно.

Автор: Zzz 10.6.2003, 16:30
Все что тут написано - примеры прямой рекурсии. Есть еще косвенная. На псевдо языке выгдядит так:

Код


процедура А
начало
   ...
   вызов процедуры В
   ...
конец

процедура В
начало
   ...
   вызов процедуры А
   ...
конец



Может такая форма рекурсии тебе пригодится тоже.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)