Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рекурсия 
:(
    Опции темы
<Spawn>
Дата 9.6.2003, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



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


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
eof
Дата 9.6.2003, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 30.5.2003

Репутация: нет
Всего: нет



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

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

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

надеюсь все правильно...
PM MAIL   Вверх
dm9
Дата 9.6.2003, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 6
Всего: 137



Наглядный пример - удаление каталога со всем содержимым

http://www.delphimaster.ru/cgi-bin/faq.pl?...=988622376&n=15
PM MAIL ICQ   Вверх
Kesh
Дата 10.6.2003, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2488
Регистрация: 31.7.2002
Где: Германия, Saarbrü cken

Репутация: 4
Всего: 54



То, что помню из лекций...
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;

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

Это сообщение отредактировал(а) kesh - 10.6.2003, 08:58


--------------------
user posted image
PM MAIL WWW ICQ Skype   Вверх
Song
Дата 10.6.2003, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: 2
Всего: 4



Печать ветви на принтер с помощью рекурсии:

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 и т.д. делать, думаю, понятно.



--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
Zzz
Дата 10.6.2003, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 306
Регистрация: 21.2.2003
Где: Мурманск

Репутация: нет
Всего: 5



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

Код


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

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



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

Это сообщение отредактировал(а) Zzz - 10.6.2003, 16:31


--------------------
Бесполезной громоздкой надстройкой является Windows от Майкрософт. Она занимает 1Мб памяти диска и рассчитана на использование устройства типа мышь.

"ЭВМ в инженерной практике" М. 1989г.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0571 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.