Die folgenden Funktionen implementieren Binäre Suche mit Gradientenabstieg auf jeweils einem Array vom Typ TWay bzw. TNode. Kann man diese Funktion auch so formulieren, dass Freepascal beide Typen akzeptiert, dass man sich die zweite spart (ist ja der gleiche Code)? Mir fällt nur ein das Ganze in einer generischen Klasse zu implementieren, und diese für beide Typen abzuleiten. Aber das erscheint mir irgendwie wie mit Kanonen auf Spatzen... Geht das nicht auch ohne Klasse?
Code: Alles auswählen
function NodeByID(a: array of TNode; ID: LongWord): TNode;
var
i: Integer;
begin
result := nil;
if Length(a) < 1 then
Exit;
if Length(a) = 1 then begin
if a[0].ID = ID then
result := a[0];
Exit;
end;
i := trunc(((ID-a[0].ID)*(Length(a)-1))/(a[Length(a)-1].ID-a[0].ID));
if a[i].ID = ID then
result := a[i]
else if a[i].ID > ID then
result := NodeByID(a[i+1..Length(a)-1],ID)
else
result := NodeByID(a[0..i-1],ID);
end;
function WayByID(a: array of TWay; ID: LongWord): TWay;
var
i: Integer;
begin
result := nil;
if Length(a) < 1 then
Exit;
if Length(a) = 1 then begin
if a[0].ID = ID then
result := a[0];
Exit;
end;
i := trunc(((ID-a[0].ID)*(Length(a)-1))/(a[Length(a)-1].ID-a[0].ID));
if a[i].ID = ID then
result := a[i]
else if a[i].ID > ID then
result := WayByID(a[i+1..Length(a)-1],ID)
else
result := WayByID(a[0..i-1],ID);
end;