Funkcją nazwiemy procedurę, która w wyniku wywołania zwraca jakąś wartość.
function nazwa( lista parametrów ) : typ wyniku;vardeklaracja zmiennych lokalnychbegin...end;
Przykładowo funckja może wyglądać w taki sposób:
function wartBezwzgledna(x: integer):integer;
begin
if (x<0) then wartBezwzgledna:= -x
else wartBezwzgledna:= x;
end;
Jak widać, aby zwrócić w funkcji jakąś wartość stosujemy zapis w postaci
nazwaFunkcji := wartosc;
Zwróćmy uwagę, że liczy się zawsze ostatnia z przypisanych wartości, czyli w przypadku
function proc():integer;
var p : integer;
begin
proc:=1
proc:=2;
end;
Wywołanie
writeln(proc());
Wypisze na ekran 2.
Pełen przykład kodu z funkcją:
program pierwszy;
var
a,b,m: integer;
function wartBezwzgledna(x: integer):integer;
begin
if (x<0) then wartBezwzgledna:= -x
else wartBezwzgledna:= x;
end;
begin
writeln('Podaj ujemną liczbę');
readln(a);
b:= wartBezwzgledna(a);
writeln('Wartosc b ', b);
writeln('Wartosc bezwgl z a ',wartBezwzgledna(a));
writeln('Wartosc bezwgl z 10 to ',wartBezwzgledna(10));
writeln('Wartosc bezwgl z -5 to ',wartBezwzgledna(-5));
wartBezwzgledna(a);
readln();
End.
W powyższym przykładzie możemy zaobserwować różne sposoby wywołania funkcji i przypisania jej wartości. Do funkcji możemy przekazać zmienną, lub też wpisać jawnie wartość liczbową z jaką chcemy ją wywołać, wtedy też ta wartość zostanie przypisana zmiennej z deklaracji funkcji (u nas jest to x).
Wartość, która jest zwracana przez funkcje może być przypisana do zmiennej, lub też wypisana. Trzecią opcją jest nie przypisywanie wartośći funkcji do żadnego z elementów. W takim wypadku funkcja zadziała jak procedura.
Jeżeli procedura lub funkcja w czasie swojego wykonywania wywołuje samą siebie, to mamy do czynienia z tzw. rekurencją. Dla przykładu podamy program obliczający sumę pierwszych n liczb naturalnych.
program pierwszy;
var
a,b,m: integer;
function a_n(n: Integer) : Integer;
begin
if (n > 1) then
a_n := a_n(n-1) + n
else
a_n := 1;
end;
begin
writeln('Podaj liczbe');
readln(a);
writeln('Suma 1+...+',a,' wynosi ', a_n(a));
readln();
End.
W tym wypadku wywołanie \(a_n(n-1)\) zwraca wartość sumy \(1+2+...+(n-1)\), gdy program dochodzi do \(n=1\) zwracana jest wartość \(1\). Przemyśl dokładnie działanie powyższej funkcji, rozpisz sobie na kartce kolejne etapy.
Zadanie 1
Wytłumacz działanie poniższego programu :
program prog;
var m, n, p , q : integer;
procedure proc(m:integer; var n:integer);
var p : integer;
begin
m:=1; n:=1; p:=1; q:=1
end;
begin
m:=0; n:=0; p:=0; q:=0;
proc(m,n);
writeln ('m=',m,', n=',n,', p=',p,', q=',q);
readln();
end.
Zadanie 2
Napisz funkcję wyliczającą silnię i przetestuj jej działanie.
Zadanie 3
Napisz funkcję wyliczającą silnię za pomocą rekurencji (z poniższego pseudokodu):
Zadanie 4
Napisz funkcję wyliczającą NWD z poniższego pseudokodu.
Zadanie 5
Napisz funkcję wyliczającą NWD za pomocą rekurencji (z poniższego pseudokodu):
Zadanie 6
Napisz funkcję wyliczającą $n$-ty wyraz ciągu fibonacciego za pomocą rekurencji.