Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.12.16;
Скачать: CL | DM;

Вниз

Пример рекурсии   Найти похожие ветки 

 
ИМХО ©   (2003-12-04 08:41) [0]

Господа, поделитесь примером рекурсии (что-то я эту тему раньше незаслуженно обходил).

Ситуация: есть множество записей с полями ID, ParentID и Name. Нужно построить своего рода дерево.


 
Anatoly Podgoretsky ©   (2003-12-04 08:46) [1]

Рекурсия это очень простое явление, вот пример простой бесконечной рекурсии.

procedure F;
begin
F;
end;


 
Рамиль ©   (2003-12-04 08:58) [2]


> Anatoly Podgoretsky ©

Бесконечнвя рекурсия это хорошо, но желательно выход из нее предусмотреть все таки:)
пример:

function Factorial(n: integer): extended;
begin
if n > 0 then Result := n * Factorial(n-1)
else Result := 1;
end;


 
wal ©   (2003-12-04 09:14) [3]


> Ситуация: есть множество записей с полями ID, ParentID и
> Name. Нужно построить своего рода дерево.

Это не дерево, а однонаправленый список.

ЗЫ. Причем тут рекурсия?

С уважением.


 
Рамиль ©   (2003-12-04 09:20) [4]


> wal © (04.12.03 09:14) [3]


Если все это прописано в одной таблице, то не то что дерево, лес можно сделать.


 
Silver Alex ©   (2003-12-04 09:27) [5]

как именно хочешь строить, где, и по чем?
есть такой пример, но он только достает ID детей

function ChildsList(aConnection: TADOConnection;const aTableName,aKeyField,aParentField: String;
const StartID: Integer): String;
var
tmpStr,s: String;
begin
Result:= IntToStr(StartID);
with TADODataSet.create(nil) do
try
Connection:=aConnection;

s:="select * from "+aTableName + " where "+ aKeyField+"<>"+aParentField +
" and "+aParentField+"="+IntToStr(StartID);
CommandText:=s;
Open;
while not Eof do
begin
tmpStr:=ChildsList(aConnection, aTableName,
aKeyField,aParentField,fieldbyname(aKeyField).AsInteger);
if tmpStr<>EmptyStr then
Result:=Result+","+tmpStr;
Next;
end;
Close;
finally
Free;
end;
end;


 
Рамиль ©   (2003-12-04 09:38) [6]

function CreateTree(Id: integer);
var
IdArr: array of integer;
i: integer;
begin
DataSet.Close;
DataSet.CommandText := format("select * from TableName where ParentId = %s" [Id]);
DataSet.Open;
if DataSet.IsEmpty then exit;

{*здесь формирование вывода горизонтали или как там она называется, не помню*}

SetLength(IdArr, DataSet.Recordcount);
DataSet.First;
i := 0;
while not DataSet.Eof do
begin
IdArr[i] := DataSet["Id"];
inc(i);
end;
for i := 0 to High(IdArr) do
CreateTree(IdArr[i]);
IdArr := nil;
end


 
ИМХО ©   (2003-12-04 09:46) [7]

Удалено модератором


 
Skier ©   (2003-12-04 10:08) [8]

Хороший, а главное полезный пример рекурсии :
http://www.delphimaster.ru/cgi-bin/faq.pl?look=1&id=1015254946&n=19


 
Danilka ©   (2003-12-04 10:40) [9]

Приведу еще один пример рекурсии:
http://delphimaster.net/view/1-1070516482/

[7] ИМХО © (04.12.03 09:46)
Интересно, а что тебе не понравилось?
Ворос: "поделитесь примером рекурсии"
И первый и второй ответы - вполне нормальные и отвечают вопросу. В чем проблемы? В том что ты вопросы задавать не умеешь? Ну так обижайся сам на себя. :))


 
ИМХО ©   (2003-12-04 11:15) [10]

Удалено модератором



Страницы: 1 вся ветка

Текущий архив: 2003.12.16;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.013 c
1-52256
Temik
2003-12-03 14:16
2003.12.16
Есть ли в Delphi эквивалент функции Asc()


1-52267
lipskiy
2003-11-30 20:36
2003.12.16
Приложение загружает ЦП на 100%, как побороть?


3-52071
Inkotex
2003-11-25 09:27
2003.12.16
Нужна помощь по SQL


1-52190
selena
2003-12-05 13:55
2003.12.16
Печать Dos файла


6-52302
saNat
2003-10-04 20:59
2003.12.16
Дозвон