Algorytmy i programowanie

Funkcje

Funkcją nazwiemy procedurę, która w wyniku wywołania zwraca jakąś wartość.

function nazwa( lista parametrów ) : typ wyniku;
var
deklaracja zmiennych lokalnych
begin
...
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.

Rekurencja

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):

2.png

Zadanie 4

Napisz funkcję wyliczającą NWD z poniższego pseudokodu.

1.png

Zadanie 5

Napisz funkcję wyliczającą NWD za pomocą rekurencji (z poniższego pseudokodu):

3.png

Zadanie 6

Napisz funkcję wyliczającą $n$-ty wyraz ciągu fibonacciego za pomocą rekurencji.