Funkcje.



Funkcja (FUNCTION), jest rodzajem procedury, która po wywołaniu zwraca obliczoną przez siebie wartość (typu prostego lub wskaźnikowego) pod swoją nazwą.
Wartość funkcji traktowana jest jak wyrażenie, może więc być elementem wyrażeń, argumentem innych funkcji, procedur itp. Związane jest to właśnie z faktem zwracania wartości funkcji pod jej nazwą.



Definicja funkcji :
FUNCTION Nazwa_funkcji(Lista_parametrów): Typ_wyniku;
...Część_opisowa
BEGIN
...Ciąg_instrukcji
END;
Typ wyniku określa typ zmiennej jaki ma być przypisany danej funkcji.

Ciąg instrukcji musi zawierać instrukcję przypisania postaci :
Nazwa_Funkcji:=Wyrażenie;
lub
Nazwa_Funkcji:=Wartość;
w przeciwnym wypadku funkcji nie zostanie przypisana żadna wartość.



Sposoby Wywołania funkcji, np. :
Nazwa_Funkcji(Lista_parametrów);
lub
Zmienna:=Nazwa_Funkcji(Lista_parametrów);


Przykładowa funkcja obliczająca silnię :
FUNCTION Silnia (n : Integer) : Extended;
Var i     : Integer;
    Wynik : Extended;
Begin
   Wynik:=1;
   For i:=1 To n Do Wynik:=Wynik*i;
   Silnia:=Wynik;
End;
lub innaczej :
FUNCTION Silnia (n : Integer) : Extended;
Begin
  If n=1 Then Silnia:=1 Else Silnia:=n*Silnia(n-1);
End;
Drugi sposób wykorzystuje tzw. Rekurencję czyli wywoływanie procedury (funkcji) przez siebie samą. Rozwiązanie takie ma zastosowanie gdy wykonywane czynności powtarzają się i nie zna się liczby tych powtórzeń. Rekurencja pozwala na proste i eleganckie rozwiązanie wielu problemów, czego przykładem jest obliczanie silni. Jednak pod pozorną prostotą maskuje się nieraz ogromny nakład obliczeniowy, związany z wielokrotnym wywoływaniem procedury. Zagrożenie kryje się tutaj w fakcie, że nakładu tego po prostu nie widać a każde wywołanie procedury umieszcza dane na stosie, który ma ograniczoną pojemność.



Przykład :

{$N+}               { Wlaczenie koprocesora arytmetycznego }
PROGRAM Silnie;

USES Crt;

VAR n  : Integer;
    Zn : Char;

FUNCTION Silnia1 (n : Integer) : Extended;
Var i     : Integer;
    Wynik : Extended;
Begin
  Wynik:=1;
  For i:=1 To n Do Wynik:=Wynik*i;
  Silnia1:=Wynik;
End;

FUNCTION Silnia2 (n : Integer) : Extended;
Begin
  If n=1 Then Silnia2:=1 Else Silnia2:=n*Silnia2(n-1);
End;

BEGIN
  ClrScr;
  Write('Podaj liczbe dla ktorej obliczyc silnie : ');
  ReadLn(n);
  WriteLn('Silnia obliczona iteracyjnie   = ', Silnia1(n):3:0);
  WriteLn('Silnia obliczona rekurencyjnie = ', Silnia2(n):3:0);
  Zn:=ReadKey;
END.