vai
Pom : Integer; begin
while (A<>B) do begin
if A<B then begin
Pom A; A B; B Pom; end;
A A - B; end;
NWD A;
end; {--------------------------NWD -}
begin
Write ('Podaj A: Readln (A);
Write ('Podaj B: '); Readln (B);
Write ('NWD (', A, ', ', B, ') - ', NWD (A, B)); Readln;
end.
Tutaj dopiero mamy ciekawostkę. Zmienne A i B są zadeklarowane jako globalne, a operujemy na nich w funkcji i zmieniamy ich wartość. I to niby jest dobrze? A co z działaniami ubocznymi? Nie dajmy się zwieść. Nie działamy na zmiennych globalnych. Zauważ, że A i B są także parametrami funkcji. Na parametrach możemy działać i zmiany te nie będą miały (o ile parametry są zadeklarowane w ten sposób; niedługo poznasz drugi sposób, dla którego to nie będzie prawdą) znaczenia na zewnątrz funkcji.
Wyobraźmy sobie, że chcielibyśmy wzbogacić nasz program i wypisywać oprócz NWD także NWW (najmniejszą wspólną wielokrotność). Już wiemy, że można ją wyliczyć ze wzoru NWW(A, B) = A*B / NWD(A, B). Jeżeli więc będziemy pisać funkcję NWW, może ona korzystać z już napisanej NWD (o ile będzie ją znała, powinna więc być zadeklarowana po niej). Może ona mieć postać:
function NWW (A, B: Integer) : Integer;
{ funkcja oblicza wartość najmniejszej wspólnej wielokrotności }
{ liczb A i B uzywajac funkcji NWD. j
begin
NWW A * B * NWD (A, B);
end; {
NWW -}
Powstaje pytanie: jeżeli jedna funkcja może korzystać do wyliczenia swojej wartości z innych, to czy może korzystać z siebie? Pozwoliłoby nam to na zaprogramowanie reku-rencji.
Oczywiście jest taka możliwość.
W I C 1 E N I £
Spójrz na rekurencyjną definicję silni w ćwiczeniu 1.6.