Oto dwie implementacje algorytmu liczącego n!:
- z książki:
function Silnia(n: Integer): Integer;
begin
if n <= 0 then
Result := 1
else
Result := Silnia(n-1) * n;
end;
- moja:
function MojaSilnia(n: Integer): Integer;
begin
if n = 0 then
Result := 1
else if n = 1 then
Exit
else
Result := MojaSilnia(n-1) * n;
end;
Mimo, że kompilator wywala ostrzeżenie: Return value of function 'MojaSilnia' might be undefined, obie liczą poprawnie do wartości 12!, ponieważ większe wartości dają wyniki wykraczające poza zakres Integer. Żeby policzyć, np. 15! można zrobić małą modyfikację:
function Silnia(n: Integer): Int64;
begin
if n <= 0 then
Result := 1
else
Result := Silnia(n-1) * n;
end;
function MojaSilnia(n: Integer): Int64;
begin
if n = 0 then
Result := 1
else if n = 1 then
Exit
else
Result := MojaSilnia(n-1) * n;
end;
Kompilator nadal wyrzuca w/w ostrzeżenie i zaczynają się dziać dziwne (?) rzeczy. Pierwsza funkcja liczy poprawnie do wartości 19!, bo na tyle wystarcza typ Int64, druga „wymyśla” takie bzdury, że głowa pęka. Może mi ktoś powiedzieć, co jest grane?