@emexajt - jeśli pieszesz kod we Free Pascalu to korzystaj z jego dobrodziejstw i puść w niepamięć składnię i możliwości DOSowego, 20-letniego TP; Głównie mam na myśli nieużywanie ukrytej zmiennej Result, wzamian za przypisywanie zwracanej wartości do "nazwy funkcji"; No i typy takie jak Byte
czy Integer
mają swoje czytelne aliasy, czyli np. UInt8
, Int32
itd.;
Co do samego algorytmu - używasz o dwa razy za dużo zmiennych; Jedna już jest zadeklarowana (oczywiście chodzi o Result), natomiast potrzebujesz dwie zmienne - jedna do zapamiętywania wartości poprzedniego wyrazu, a druga służąca za iterator pętli; Aktualnie wyliczony wyraz od razu można zapakować do Result:
function GetFibonacciNumber(AIndex: UInt32): UInt32;
var
intPrev, intLoop: UInt32;
begin
if AIndex in [0, 1] then Exit(AIndex);
intPrev := 0;
Result := 1;
for intLoop in [2 .. AIndex] do
begin
Result := intPrev + Result;
intPrev := Result - intPrev;
end;
end;
Przy czym nadmienić należy, że typ Byte (czy jakikolwiek inny jednobajtowy) nie nadaje się do tej funkcji, bo przekręci się licznik już przy 14-tym wyrazie; A jeśli nie podoba Ci się używanie zmiennej Result to zawsze można zadeklarować sobie dodatkową zmienną, tyle że pod adresem tej ukrytej, za pomocą słówka Absolute:
function GetFibonacciNumber(AIndex: UInt32): UInt32;
var
intCurr: UInt32 absolute Result;
intPrev, intLoop: UInt32;
begin
if AIndex in [0, 1] then Exit(AIndex);
intPrev := 0;
intCurr := 1;
for intLoop in [2 .. AIndex] do
begin
intCurr := intPrev + intCurr;
intPrev := intCurr - intPrev;
end;
end;
Ale to raczej w ramach ciekawostki.