Esercizi svolti a lezione il 5 Ottobre 2000 & Esercizi proposti
program Massimo;
{pre: nessuna condizione}
{post: massimo di una sequenza di interi in input e sua posizione}
var x, max, maxpos, c: integer;
begin
max:=0;
c:=1;
readln(x);
while (x<>0) do {inv. 'max contiene l'intero massimo introdotto finora'}
begin
if (x>max)
then begin max:=x; maxpos:=c; end;
readln(x);
c:=c+1;
end;
if (max<>0)
then writeln('Il massimo ', max,' era in posizione ', maxpos)
else writeln('La sequenza considerata era vuota');
readln;
end.
NOTA: La soluzione proposta puo` essere migliorata sotto alcuni punti di
vista. Provateci, se volete...
program Moltiplicazione1;
{pre: n,m>=0 interi}
{post: calcolo e stampa di n*m iterando la somma}
var n, m, i, p: integer;
begin
readln(n,m);
p:= 0; {p = n*0}
for i:= 0 to m-1 do {inv. p = n*i}
p:= p+n;
writeln(p) {i = m, dunque p = n*m}
end.
program Moltiplicazione2;
{pre: n,m>=0 interi}
{post: calcolo e stampa di n*m iterando la somma}
var n, m, i, p: integer;
begin
readln(n,m);
p:= 0; {p = n*0}
for i:= 1 to m do {inv. p = n*(i-1)}
p:= p+n;
writeln(p) {i = m+1, dunque p = n*m}
end.
NOTA: I programmi Moltiplicazione1 e Moltiplicazione2 sono
equivalenti e differiscono solo per l'inizializzazione della e
la condizione di terminazione sulla variabile 'i' del ciclo 'for',
ma e` comunque interessante comparare le rispettive invarianti
(asserzioni) di ciclo.
Funzioni definibili iterativamente: Esercizi proposti
Gli esercizi che seguono sono alcuni esempi di funzioni che, tranne il
fibonacciano, sono o disponibili preimplementate, oppure banalmente
definibili utilizzando funzioni di libreria (come la moltiplicazione
eseguita con somme iterate). Lo scopo degli esercizi e' invece quello di
ridefinirle utilizzando solo un sottoinsieme delle funzioni preimplementate.
Fibonacciano
Esercizio La funzione di Fibonacci fib(n) e' definita come segue:
fib(0) = 0
fib(1) = 1
fib(n+2) = fib(n) + fib(n+1)
Si scriva un programma iterativo che, dato n, calcoli fib(n).
Suggerimento Il calcolo di fib(n) quando n>1 dipende
dai valori di fib su 0,...,n-2,n-1, ma di tutti questi servono
solo gli ultimi due.
Somma, differenza, esponenziale, moltiplicazione veloce
Esercizi
1. Si definisca la somma tra interi positivi utilizzando soltanto
il successore (_+1) e la relazione di minore.
2. Definire iterativamente la differenza naturale -- (n -- m =
n-m se n>=m, n -- m = 0 altrimenti) utilizzando il predecessore
naturale (pred(n) = n-1 se n>0, pred(0)=0).
3. Definire iterativamente l'esponenziale tra naturali
usando il prodotto.
4. Velocizzare la definzione iterativa del prodotto sfruttando
le eguaglianze:
n * 2m = 2n * m = (n+n) * m,
n * (2m + 1) = 2n * m + n = [(n+n) * m] + n.
Si osservi che nella parte destra delle eguaglianze il
moltiplicatore e' piu' piccolo che nella parte sinistra.
Nel programma si usino div e mod.
Soluzioni.