Witam, przedstawiam dwa algorytmy obliczania silni: iteracyjny oraz rekurencyjny. Przypomnę, że silnia jest to iloczyn kolejnych liczb naturalnych i oznaczamy ją znakiem ! (wykrzyknik), np.:
1 2 3 |
n = 5 n! = 1 * 2 * 3 * 4 * 5 = 120 |
Algorytm iteracyjny.
W tym przypadku, obliczamy silnię w pętli, mnożąc wartość zwracaną przez funkcję przez kolejne wartości zmiennej i:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
function SilniaI(Liczba : Longint) : Longint ; var i : Integer ; begin if Liczba < 0 then begin Result := 0 ; Exit ; end ; Result := 1 ; if Liczba < 2 then Exit ; for i := 1 to Liczba do Result := Result * i ; end ; |
Algorytm rekurencyjny.
Funkcja wywołuje samą siebie, dopóki przesyłana wartość nie jest równa 1, zwracając kolejne wyniki:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
function SilniaR(Liczba : Longint) : Longint ; begin if Liczba < 0 then begin Result := 0 ; Exit ; end ; Result := 1 ; if Liczba < 2 then Exit ; Result := Result * Liczba ; if Liczba > 1 then Result := Result * SilniaR(Liczba - 1) end ; |
Autor: Iskar