ESERCIZIO
Sia dato un vettore A di interi di dimensione N, scrivere una funzione
ricorsiva che restituisca la somma di tutti gli elementi di A.
Sia dato un vettore A di interi di dimensione N, scrivere una
procedura ricorsiva che restituisca la somma di tutti gli elementi
pari di A e la somma di tutti gli elementi dispari di A.
PROGRAM sommavet(output,input);
TYPE
Vett=ARRAY[1..10] OF integer;
VAR
A1:vett; N1,som1:integer;
PROCEDURE somma(VAR A:vett;VAR som:integer;N:integer);
BEGIN
IF N=0 THEN
som:=0
(*MAIN*)
ELSE
BEGIN
BEGIN
N1:=10;
writeln(' push ',n:3,som:5);
FOR i:=1 TO N1 DO
Somma(A,som,(N-1));
Read(A1[i];
som:=som+A[N];
somma(A1,som1,N1);
writeln(' pop ',n:3,som:5);
writeln('La somma Š ',som1:4);
END;
readln
END;
END.
sommave1
PROGRAM sommavet(output,input);
TYPE
Vett=ARRAY[1..10] OF integer;
VAR
A1:vett; N1,som1:integer;
PROCEDURE somma(VAR A:vett;VAR som:integer;N:integer);
BEGIN
IF N=0 THEN
(*MAIN*)
writeln(' fine ')
BEGIN
ELSE
N1:=10;
BEGIN
FOR i:=1 TO N1 DO
writeln(' push ',n:3,som:5);
Read(A1[i];
som:=som+A[N];
somma(A1,som1,N1);
Somma(A,som,(N-1));
writeln('La somma Š ',som1:4);
writeln(' pop ',n:3,som:5);
readln
END;
END.
END;
sommave2
PROGRAM sommavet(output,input);
TYPE
Vett=ARRAY[1..10] OF integer;
VAR
A1:vett; N1,som1:integer;
PROCEDURE somma(VAR A:vett;VAR som:integer;N:integer);
BEGIN
IF N<>0 THEN
(*MAIN*)
BEGIN
BEGIN
writeln(' push ',n:3,som:5);
N1:=10;
som:=som+A[N];
FOR i:=1 TO N1 DO
Somma(A,som,(N-1));
Read(A1[i];
writeln(' pop ',n:3,som:5);
somma(A1,som1,N1);
END;
writeln('La somma Š ',som1:4);
END;
readln
END.
sommave3
PROGRAM sommavet3(output,input);
TYPE
Vett=ARRAY[1..10] OF integer;
VAR
A1:vett; N1:integer;
FUNCTION somma(VAR A:vett;N:integer):integer;
BEGIN
IF N=0 THEN
(*MAIN*)
somma:=0
BEGIN
ELSE
N1:=10;
Somma:=Somma(A,(N-1))+A[N];
FOR i:=1 TO N1 DO
END;
Read(A1[i];
somma(A1,som1,N1);
writeln('La somma Š ',som1:4);
readln
END.
sommavef
PROGRAM sommavet(output,input);
TYPE
Vett=ARRAY[1..10] OF integer;
VAR
A1:vett; i,N1,somp1,somd1:integer;
PROCEDURE somma(VAR A:vett;VAR somp,somd:integer;N:integer);
BEGIN
IF N=0 THEN
BEGIN
(*MAIN*)
somp:=0;
BEGIN
somd:=0
N1:=10;
END
FOR i:=1 TO N1 DO
ELSE
Read(A1[i];
BEGIN
N1:=10;
Somma(A,somp,somd,(N-1)); writeln;
IF A[N] MOD 2=0 THEN
FOR i:=1 TO N1 DO
somp:=somp+A[N]
write(A1[i]:4);
ELSE
writeln;
somd:=somd+A[N];
somma(A1,somp1,somd1,N1);
END;
writeln('La somma pari è ',somp1:4,
END;
' la somma dispari è ',somd1:4);
readln
END.
Dato un vettore di interi scrivere una procedura ricorsiva che
trovi il valore del numero più grande in esso contenuto
FUNCTION Vettor(Indice:integer;VAR A1:arrayx;
VAR Max:integer):integer;
BEGIN
IF Indice =0 THEN
MAX:=0
ELSE
BEGIN
Vettor:= Vettor (Indice-1,A1, Max);
IF (A1[Indice] > Max) THEN Max :=A1[Indice];
END;
Vettor:= Max;
END;
PROGRAM Diagonale(input,output);
{ Assegnata una matrice MxM determinare, con una procedura ricorsiva,
il valore massimo in ciascuna delle due diagonali principali.}
TYPE
Arrayx=Array[1..10,1..10] of integer;
VAR A:arrayx;
N, M1,M2:integer;
PROCEDURE Diagona(Niniz,N1:integer;VAR A1:arrayx;VAR MD1,MD2:integer);
{Scorri a partire dal basso ricorsivamente la matrice. Seleziona nelle
due diagonali gli elementi più grandi}
VAR N2,N3:integer;
{******** MAIN************}
N:=5;
BEGIN
ScriviMatrice(A,N);
IF N1=0 THEN
Diagona(N,N,A,M1,M2);
BEGIN
writeln(' I Massimi sono ', M1,' e ',M2);
MD1:=0;
readln
MD2:=0;
END.
END
ELSE
BEGIN
Diagona(Niniz,N1-1,A1,MD1,MD2);
IF A1[N1,N1]>MD1 THEN MD1:= A1[N1,N1];
IF A1[N1,Niniz-N1+1]>MD2 THEN MD2:= A1[N1,Niniz-N1+1];
END;
END;
FUNCTION Diagona(Niniz,N1:integer;VAR A1:arrayx;VAR
MD1,MD2:integer):integer;
{Scorri a partire dal basso ricorsivamente la matrice. Seleziona
nelle due diagonali gli elementi più grandi e di questi stampa il
maggiore}
VAR
N2,N3:integer;
BEGIN
IF N1=0 THEN
BEGIN
MD1:=0;
MD2:=0;
END
ELSE
BEGIN
Diagona:=Diagona(Niniz,N1-1,A1,MD1,MD2);
IF A1[N1,N1]>MD1 THEN MD1:= A1[N1,N1];
IF A1[N1,Niniz-N1+1]>MD2 THEN MD2:= A1[N1,Niniz-N1+1];
END;
Diagona:=MD1;
IF MD1 < MD2 Then Diagona:=MD2;
END;
.
ESERCIZI
ESERCIZI
•Sommare le seguenti espressioni per tutti gli interi compresi tra N1 ed
N2
i  1;
2
i  2i ; 2i  i
2
3
FUNCTION Sommatoria (N11,N22:integer):integer;
BEGIN
IF N11=N22 THEN
Sommatoria:=N22*N22+1
ELSE
Sommatoria :=N22*N22+1+Sommatoria(N11,N22-1)
END;
sopn1n3
Esercizi sui vettori. Scrivere una funzione e/o procedura ricorsiva che
1) Restituisca il minimo o il massimo in un vettore di interi;
2) Restituisca l’indice del minimo e/o del massimo; (funzione o
procedura)
3) Trova la massima differenza in valore assoluto tra un
elemento ed il precedente ( escluso il primo)
FUNCTION Vettori(IndiceA:integer; VAR max:integer;
VAR A1:arrayx):integer;
{Cerca l'elemento massimo del vettore A }
BEGIN
IF IndiceA =0 THEN
Max:=0
ELSE
{MAIN}
Vettori:=Vettori(IndiceA-1,max,A1);
BEGIN
IF A1[IndiceA]>max THEN
N:=9;
max:= A1[IndiceA];
A[1]:=………………….;
Vettori:=max;
scriviVettore(A,N);
END;
differenza(N,D,A);
writeln(‘differenza massima‘,D);
writeln('massimo',Vettori(N,N,A));
END.
PROCEDURE Differenza(IndiceA:integer;
VAR diff:integer;VAR A1:arrayx);
{ Trova la massima differenza nel vettore A }
BEGIN
IF IndiceA =1 THEN
diff:=0
ELSE
Differenza(IndiceA-1,diff,A1);
IF abs(A1[IndiceA]- A1[IndiceA-1])>diff THEN
diff:= abs(A1[IndiceA]-A1[IndiceA-1]);
END;
maxvet
Esercizi sulle matrici
Assegnata una matrice A di interi
1) scrivere una funzione ricorsiva che restituisca true se è simmetrica,
false altrimenti.
2) scrivere una procedura o funzione ricorsiva che restituisca il valore
true se la matrice possiede due righe uguali, false altrimenti.
3) scrivere una procedura o funzione ricorsiva che calcoli la somma
delle righe dispari e quelle delle righe pari
4) scrivere una funzione ricorsiva che restituisca true se tutti gli
elementi della diagonale principale sono positivi
5) scrivere una procedura o funzione ricorsiva che controlli se la
somma degli elementi della diagonale principale è uguale a quella
della diagonale secondaria
6) scrivere una procedura o funzione ricorsiva che restituisca il valore
true se ogni riga i-esima della matrice possiede un numero di i
valori negativi, false altrimenti.
Altri esercizi sulla ricorsione.
Un caso base
1 - Assegnata una matrice MxM determinare, con una funzione ricorsiva, il valore massimo tra i
massimi delle diagonali principali.
Esempio
1
3
5
2
4
6
8
1
10
Il valore massimo appartenente alla prima diagonale principale è 10 in A[3,3]
Il valore massimo appartenente alla seconda diagonale principale è 8 in A[3,1]
Il valore massimo cercato è quindi 10 in A[3,3].
2 - Assegnato un file di testo con stringhe lunghe N per ogni rigo, determinare quante sono le
occorrenze di un carattere preassegnato con una funzione ricorsiva.
Esempio
Cercare le occorrenze di ‘e’ nel seguente testo:
La Vispa Teresa
Avea tra l’erbetta
A volo sorpresa
Gentile farfalletta
‘e’ ricorre 9 volte
PROGRAM Diagonale(input,output);
{ Assegnata una matrice MxM determinare, con una funzione ricorsiva,
se la somma delle due diagonali sono uguali.}
TYPE
Arrayx=Array[1..10,1..10] of integer;
VAR
A:arrayx;
N,i1,M1,M2:integer;
FUNCTION Diagona(i,N1:integer;VAR A1:arrayx;VAR MD1,MD2:integer):boolean;
{Controlla se la somma delle due diagonali sono uguali}
BEGIN
IF i>N1 THEN
Diagona:=FALSE
ELSE
BEGIN
MD1:=MD1+A1[i,i];
MD2:=MD2+A1[i,n1+1-i];
Diagona:=diagona(i+1,N1,A,MD1,MD2); {MAIN}
BEGIN
END;
A[…,…]:=xxxx;
IF MD1=MD2 THEN Diagona:=TRUE;
N:=5;i1:=1;
END;
ScriviMatrice(A,N);
writeln('Somme uguali ',Diagona(i1,N,A,M1,M2));
readln;
END.
PROGRAM Diagonale(input,output);
{ Assegnata una matrice MxM determinare, con una funzione ricorsiva,
se ci sono due righe uguali.}
TYPE
Arrayx=Array[1..10,1..10] of integer;
VAR
A:arrayx;
N,i1,j1:integer;
FUNCTION righe(i,j,N1,M1:integer;VAR A1:arrayx):boolean;
{Cerca due righe uguali}
BEGIN
IF i=N1 THEN
Righe:=FALSE
ELSE
IF j>M1 THEN
Righe:=TRUE
ELSE
IF A1[i,j]= A1[i+1,j] THEN
Righe:=righe(i,j+1,N1,M1,A1)
ELSE
Righe:=righe(i+1,1,N1,M1,A1)
END;
END;
{MAIN}
BEGIN
A[..,..]:=xxxx;
N:=5;i1:=1;j1:=1;
ScriviMatrice(A,N);
writeln('Righe ',righe(i1,j1,N,N,A));
readln;
END.
PROGRAM Diagonale(input,output);
{ Assegnata una matrice MxM determinare, con una funzione ricorsiva,
il valore massimo tra i massimi delle diagonali principali.}
TYPE
Arrayx=Array[1..10,1..10] of integer;
VAR
A:arrayx;
N,i1,tem:integer;
FUNCTION massim(i,N1:integer;VAR A1:arrayx;VAR temp:integer):integer;
{Cerca il massimo delle due diagonali}
BEGIN
IF i=N1 THEN
Temp:=0
ELSE
{MAIN}
Massim:=massim(i+1,N1,A1,temp);
BEGIN
IF temp<A[i,i] THEN temp:=A[i,i];
A[..,..]:=xxx;
IF temp<A[i,N1-i+1] THEN temp:= A[i,N1-i+1];
N:=5;i1:=1;
Massim:=temp;
ScriviMatrice(A,N);
END;
writeln('Massimo ',massim(i1,N,A,tem));
END;
readln;
END.
PROGRAM Diagonale(input,output);
{ Assegnata una matrice MxM, con una funzione ricorsiva, Controlla che in ogni riga i ci sono giusto i numeri negativi .}
TYPE
Arrayx=Array[1..10,1..10] of integer;
VAR
A:arrayx;
N,i1,j1,conta:integer;
FUNCTION Riga(i,j,N1:integer;VAR A1:arrayx;VAR conta:integer):boolean;
{Controlla che in ogni riga i ci sono giusto i numeri negativi}
BEGIN
IF i>N1 THEN
riga:=TRUE
ELSE
IF J>N1 THEN
{MAIN}
BEGIN
BEGIN
IF conta=i THEN
A[…,…]:=-xxxx;
BEGIN
N:=5;i1:=1;
Conta:=0;
j1:=1;
Riga:=riga(i+1,1,N1,A1,conta)
conta:=0;
END
ScriviMatrice(A,N);
ELSE
writeln(' la riga ',Riga(i1,j1,N, A, conta));
riga:=FALSE
readln
END
END.
ELSE
BEGIN
IF A1[i,j]<0 THEN conta:=conta+1;
IF conta<=i THEN Riga:=riga(i,j+1,N1,A1,conta)
ELSE
riga:=FALSE
END;
END;
PROGRAM Diagonale(input,output);
{ Assegnata una matrice MxM determinare, con una funzione ricorsiva,
se è simmetrica.}
TYPE
Arrayx=Array[1..10,1..10] of integer;
VAR
A:arrayx;
N,i1,j1:integer;
FUNCTION Simme(i,j,N1:integer;VAR A1:arrayx):boolean;
{Controlla se la matrice è simmetrica}
BEGIN
IF i>N1 THEN
Simme:=TRUE
ELSE
IF j>N1 THEN simme:=simme(i+1,i+2,N1,A1)
ELSE
IF A1[i,j]<>A1[j,i] THEN
{MAIN}
Simme:=FALSE
BEGIN
ELSE
A[1,1]:=1;
simme:=simme(i,j+1,N1,A1)
N:=5;i1:=1;j1:=1;
END;
ScriviMatrice(A,N);
writeln('La simmetria ',simme(i1,j1,N,A));
readln
END.
ESERCIZIO
Scrivere un algoritmo ricorsivo per il calcolo della funzione booleana
tale che assegnate due stringhe Sl e S2 restituisca TRUE se la seconda
è contenuta tutta o in parte nella prima. FALSE altrimenti.
Esempio:
Se Sl=‘Smacchiare’ e S2=‘Macchia’ allora la funzione vale TRUE.
Se Sl='Mentecatto' e S2=’tatto' allora la funzione vale FALSE
Esercizio
La Torre di Hanoi.
Dati tre pioli verticali e n dischi di dimensioni decrescenti infilati nel
primo piolo trasferire tutti i dischi sul secondo piolo, in maniera da
mantenere l’ordine decrescente, dal basso verso l’alto, adoperando un
terzo piolo di appoggio.
Algoritmo
1 - sposta i primi n-1 dischi dal piolo 0 al piolo 2 rispettando l’ordine
2 - sposta l’ultimo disco dal piolo 0 al piolo 1
3 - sposta i primi n-1 dischi dal piolo 2 al piolo 1 rispettando l’ordine
Descrivere il
processo ricorsivo
implementato nel
seguente
programma e
l’albero di
ricorsione
PROGRAM TorreDiHanoi (output);
TYPE
piolo=0..2;
VAR
i, nmossa: integer;
PROCEDURE muovi(disco:integer; sorgente, destinazione:piolo);
BEGIN
nmossa:=nmossa+1;
writeln(nmossa:3, ' muovi il disco ',disco:2, ' da',sorgente:2, ' a', destinazione:2)
END;
PROCEDURE Hanoi(n:integer; sorgente, destinazione, ausiliario:piolo);
BEGIN
IF n=1 THEN
muovi(1,sorgente, destinazione)
ELSE
BEGIN
Hanoi(n-1,sorgente, ausiliario, destinazione);
muovi(n,sorgente, destinazione);
Hanoi(n-1, ausiliario, destinazione,sorgente)
END
END;
BEGIN
FOR i:=2 TO 4 DO
BEGIN
nmossa:=0;
writeln(' ----------------------------- ');
writeln(' mossa per',i:3,' dischi');
Hanoi(i,0,1,2);
readln
END
END.
***************************
Fornire una funzione ricorsiva tale che assegnata una lista ordinata di numeri interi dica quanti e quali dei
numeri in essa contenuti sono numeri di Fibonacci.
Es.
L1=[1,3,7,11,13, 19, 21, 33, 34]
I numeri di Fibonacci presenti nella lista sono 6
(1, 3, 13, 21, 34)
***************************
Data una matrice di interi MxN scrivere una funzione ricorsiva che valga TRUE se la somma degli
elementi di ogni riga è minore della riga precedente e la somma degli elementi di ogni colonna è maggiore
della somma della colonna precedente, FALSE altrimenti.
1
8
7
5
20
3
1
9
3
16
2
4
2
1
9
5
2
6
4
11
15
24
13
FALSE
17
TRUE
2
1
4
2
3
3
1
3
6
5
4
0
5
4
2
5
9
10
15
16
16
13
11
10
ESERCIZIO
Assegnate due stringhe M1 e M2 verificare se M2 è un prefisso di S1
con una procedura ricorsiva.
Scarica

LEZIONE esercizi_Ricorsione