: index | programowanie | webmastering | algorytmika | download | projekty | słownik | grafika | flash | linki :

a l g o r y t m y > działania na liczbach >

F U N K C J A   S I L N I A

 

0 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 29 30

 
       

W matematyce funkcję n! (czyt. n-silnia) określoną na zbiorze liczb naturalnych definiuje się rekurencyjnie:

	{ 1,        gdy n=0
     n! =	{
   	{ n*(n-1)!, gdy n>0

Dla n=5: 5! = 5*4! = 5*4*3! = 5*4*3*2! = 5*4*3*2*1*0! = 5*4*3*2*1*1 = 120.
Gdyby nie wartość 0!=1 można by przyjąć, że silnia jest iloczynem liczb naturalnych nie większych od n. Na
szczęście obliczając wartość funkcji podobnie jak wartość potęgi za pomocą pętli For można o tym zapomnieć:

Function Silnia(N : Byte) : LongInt;
Var
  I     : Byte;
  Wynik : LongInt;
Begin
  Wynik:=1;
  For I:=2 To N Do Wynik:=Wynik*I;
  Silnia:=Wynik;
End;

Ze względu na rekurencyjną definicję matematyczną nie wypada nie znać algorytmu rekurencyjnego wyznaczającego wartość funkcji w sposób wynikający z definicji: aby obliczyć n! musisz najpierw obliczyć (n-1)!:

Function Silnia(N : Byte) : LongInt;
Begin
  If N=0 Then Silnia:=1
  Else Silnia:=N*Silnia(N-1);
End;

Definicja ta jest dokładnym powieleniem definicji matematycznej - stąd warunek N=0, który z powodzeniem można zastąpić nierównością N<2