Текущий архив: 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.48 MB
Время: 0.007 c