Funzioni iterative (soluzioni degli esercizi proposti il 5 Ottobre)



program Fibonacci;

VEDERE LEZIONE DEL 12 OTTOBRE


program Somma;

var n,m,s,z: integer;

begin
   write('Calcolo di n+m; n,m = ? ');
   readln(n,m);
   s:= n;
   z:= 0;
   while z < m do begin  {inv. s = n + z}
       s:= s+1;
       z:= z+1
   end;                  {post: s = n + m}
   write(n:5,' +',m:5,' =',s:5)
end.


program Differenza_naturale;

{pre: n,m>=0 interi}
{post: calcolo e stampa di n -- m dove
       n -- m = n-m se n>m,
       n -- m = 0   altrimenti.
}

var n, m, i, p: integer;

function predecessore(n: integer): integer;

begin
     if n = 0 then predecessore:= 0
     else predecessore:= n-1
end;

begin    {n -- m = predecessore^(m)(n) dove, in generale,
          f^(0)(x) = x, f^(n+1)(x) = f(f^(n)(x)}
          
     readln(n,m);
     i:= 0;
     p:= n;
     while i < m do     {inv. p = predecessore^(i)(n)}
        begin
            p:= predecessore(p);
            i:= i+1
        end;          {i = m, dunque p = predecessore^(m)(n) = n -- m}
     writeln(p)
end.


NOTA: questo programma non l'abbiamo fatto insieme, ma vi dovrebbe essere
      chiaro, essendo un'altra applicazione dell'iterazione, questa volta
      facente uso di una "funzione" di nome 'predecessore'.




program Esponenziazione;

{pre: n,m>=0 interi}
{post: calcolo e stampa di n^m, per n,m>=0, iterando il prodotto}

var n, m, i, e: integer;

begin
   readln(n,m);
   e:= 1;      {e = n^0}
   for i:= 0 to m-1 do    {inv. e = n^i}
       e:= e*n;
   writeln(e)      {i = m, dunque e = n^m}
end.

NOTA:  se facciamo il ciclo 'for' da 1 a m, anziche` da 0 a m-1, 
       l'invariante di ciclo sara` e = n^(i-1).


program Moltiplicazione_veloce;

VEDERE LEZIONE DEL 26 OTTOBRE