Sei sulla pagina 1di 70

Fondamenti di Informatica

Funzioni

Prof. E. Clementini
Le funzioni
• Suddivisione in sottoproblemi:
– non perdere di vista la strategia risolutiva globale;
– affrontare e risolvere un sottoproblema
indipendentemente dagli altri.

main
chiamata/
ritorno

S1 S2 S3

S4 S5

04/11/2021 Fondamenti di Informatica - Prof. Clementini 2


Esempio di funzioni senza parametri
def f2():
def f3():
print("C")
print("B")
f3()

def f1():
print("A")
Quindi si ha la chiamata del sottopragramma e la
def main(): definizione del sottoprogramma. Si definisce un
f1() sottoprogramma ma non si conosce se
print("D")
f2()
for i in [1,2,3]: f1()
main() è un'istruzione, identificatore con parantesi non
è più una variabile ma una funzione (chiamata a
main() funzione), bisogna andare a cercare dov'è stato
definito main, a questo punto il programma effettua le
istruzioni all'interno della definizione di main.

Prima si stampa A poi D, B, C, A, A, A (sringa che


stampa il programma). Viene chiamato più volte f1()
04/11/2021 Fondamenti di Informatica - Prof. Clementini 3
Incapsulamento delle funzioni
• Funzioni definite allo
stesso livello possono
essere richiamate da una f3()
funzione che le contiene
e dalle altre funzioni allo f2()
stesso livello
• Esempio: a livello globale f1()
possiamo richiamare le
funzioni main(), f1(), f2()
• Dalle funzioni main(),
f1(), f2() possiamo main()
richiamare loro stesse
• La funzione f3() può
essere richiamata solo da
f2() perché f3() è
incapsulata in f2()
04/11/2021 Fondamenti di Informatica - Prof. Clementini 4
Sequenza delle chiamate
f1 ()

print("A")

main() 1
4
f1()
print("D") 5
f2() 6 f3 ()
for i in [1,2,3]: f1()
print("C")

f2 () 3
2 print("B")
f3()

04/11/2021 Fondamenti di Informatica - Prof. Clementini 5


Funzioni di libreria e funzioni definite dal
programmatore
gradi=45
angolo=gradi*2*math.pi/360
La radice quadrata (sqrt) è una funzione, la quale può
print(math.sin(angolo)) essere richiamata math. è una libreria di numeri. sqrt
per lavorare necessita un valore (in questo caso 2).
print(math.sqrt(2)/2) Altri esempi sono il seno o cos. La libreria math. può
definire dei valori e delle costanti come pi (questa non
ha parentesi perchè non è una funzione ma è un
valore costante).

Per utilizzare una funzione contenuta


in una libreria bisogna importarla:

import math

04/11/2021 Fondamenti di Informatica - Prof. Clementini 6


Sintassi delle funzioni

def <identificatorefunzione> <lista parametri> :


<corpo della funzione>

Il corpo della funzione può contenere «return»


come ultima istruzione

04/11/2021 Fondamenti di Informatica - Prof. Clementini 7


Funzioni con parametri
• Concetto di indipendenza di una funzione: il codice di una
funzione deve essere scritto indipendentemente dalle altre
parti del programma
• Il passaggio di dati tra il programma chiamante e la funzione
avviene tramite parametri e il risultato della funzione è
trasmesso al programma chiamante dall’istruzione return
• la stessa funzione può essere riutilizzata più volte poiché
scriviamo un codice più generale che può operare
parametricamente su dati diversi.

04/11/2021 Fondamenti di Informatica - Prof. Clementini 8


Distanza tra due punti
import math

def DistanzaTraDuePunti(x1,y1,x2,y2):
dx=x2-x1
dy=y2-y1
distquadrato=dx**2+dy**2
risultato=math.sqrt(distquadrato) Si sfrutta una funzione di libreria
return risultato sqrt., con import math si
riescono ad importare tutte le
a0=1 definzioni del programma
a1=2 contenute nella libreria math.
b0=2 return risultato rappresenta la
b1=2 funzione per restituire al
print(DistanzaTraDuePunti(a0,a1,b0,b1)) programma il risultato dalla
funzione.

04/11/2021 Fondamenti di Informatica - Prof. Clementini 9


Funzioni con parametri
• Esempio: somma di due matrici A
• Scomposizione in tre
sottoproblemi: B

– Lettura delle matrici A e B;


– Calcolo della matrice somma C; C=A+B

– Stampa della matrice C.


C

04/11/2021 Fondamenti di Informatica - Prof. Clementini 10


Lettura matrice
• Quali sono i dati scambiati con il programma chiamante?
– Input alla funzione: numero di righe e colonne
– Output della funzione: la matrice riempita con i valori
• Intestazione della funzione:
LetturaMatrice(r,c)

04/11/2021 Fondamenti di Informatica - Prof. Clementini 11


Lettura matrice

def LetturaMatrice (r,c):


a=[[0]*c for i in range(r)]
for i in range(r):
for j in range(c):
a[i][j]=int(input("a["+str(i)+"]["+str(j)+"]="))
return a

04/11/2021 Fondamenti di Informatica - Prof. Clementini 12


Somma di matrici
• dati scambiati
– Input: matrici A e B, numero di righe e colonne
– Output: la matrice somma
• Intestazione della funzione:
SommaMatrici(A,B,r,c)

04/11/2021 Fondamenti di Informatica - Prof. Clementini 13


Somma di matrici

def SommaMatrici(a,b,r,c):
m=[[0]*c for i in range(r)]
for i in range(r):
for j in range(c):
m[i][j]=a[i][j]+b[i][j]
return m

04/11/2021 Fondamenti di Informatica - Prof. Clementini 14


Programma principale

def main():
print ("Somma di due matrici")
nr=int(input("Inserire il numero di righe "))
nc=int(input("Inserire il numero di colonne "))
A=LetturaMatrice(nr,nc)
print (A)
B=LetturaMatrice(nr,nc)
print (B)
C=SommaMatrici(A,B,nr,nc)
print("La loro somma è")
print(C)

04/11/2021 Fondamenti di Informatica - Prof. Clementini 15


Dichiarazioni delle variabili
• Dichiarazione:
– Esterna a una funzione : se una funzione f1 è dichiarata all’interno di
un’altra funzione f2, la funzione f1 può utilizzare le variabili dichiarate nella
funzione f2 ma non le può modificare
– Locale a una funzione: una variabile dichiarata in una funzione è valida
solo all’interno della funzione stessa. Se una funzione utilizza un nome di
variabile dichiarato all’esterno per modificarne il valore (cioè si fa
un’assegnazione ad essa), la variabile è locale, cioè non ha niente a che
vedere con la variabile esterna anche se ha lo stesso nome (si parla di
mascheramento)
– Le dichiarazioni di variabili fatte in funzioni dichiarate allo stesso livello non
sono visibili da una funzione all’altra

04/11/2021 Fondamenti di Informatica - Prof. Clementini 16


Parametri formali e attuali
• parametri formali: i parametri nell’intestazione della funzione
– Es.: def SommaMatrici(a,b,r,c):

• parametri attuali: i parametri specificati nella chiamata


– Es.: C=SommaMatrici(A,B,nr,nc)

04/11/2021 Fondamenti di Informatica - Prof. Clementini 17


Parametri formali e attuali
• Corrispondenza tra i parametri formali e i parametri attuali per
– numero,
– ordine,
– tipo.
• Es.:
def SommaMatrici(a,b,r,c):

C=SommaMatrici(A,B,nr,nc)

04/11/2021 Fondamenti di Informatica - Prof. Clementini 18


Ambienti di esecuzione
globale

Inizio programma main() LetturaMatrice(nr,nc)

Chiamata main() nr r

nc c
Inizio Chiamata
LetturaMatrice(nr,nc) A a
i
return a B
j
Fine Chiamata C
LetturaMatrice(nr,nc)

04/11/2021 Fondamenti di Informatica - Prof. Clementini 19


Ambienti di esecuzione
globale

Inizio programma main() LetturaMatrice(nr,nc)

Chiamata main() nr r

nc c
Inizio Chiamata
LetturaMatrice(nr,nc) A a
i
return a B
j
Fine Chiamata C
LetturaMatrice(nr,nc)

04/11/2021 Fondamenti di Informatica - Prof. Clementini 20


Ambienti di esecuzione
globale

Inizio programma main() SommaMatrici(A,B,nr,nc)

Chiamata main() nr r

nc c
Inizio Chiamata
SommaMatrici(A,B,nr,nc) A a

return m B b

Fine Chiamata C m
SommaMatrici(A,B,nr,nc) i
j

04/11/2021 Fondamenti di Informatica - Prof. Clementini 21


Ciclo di vita
• variabile esterna: il ciclo di vita pari al tempo di esecuzione
dell’intero programma o della funzione chiamante.
• variabile locale in una funzione: hanno un tempo di durata in
memoria limitato al tempo di esecuzione della funzione stessa
• associazione parametri: stessa durata delle variabili locali.

04/11/2021 Fondamenti di Informatica - Prof. Clementini 22


Visibilità
• visibilità delle variabili: nella funzione in cui sono definite e
nelle funzioni definite internamente alla funzione stessa
• parametri formali: visibilità all’interno della funzione in cui
sono dichiarati e nelle funzioni definite internamente alla
funzione stessa.

04/11/2021 Fondamenti di Informatica - Prof. Clementini 23


Visibilità
def f2():
def f3():
print("C")
print (a)
print("B")
a=2
f3()

def f1():
print("A")

def main():
f1()
print("D")
f2()
for i in [1,2,3]: f1()

main()

04/11/2021 Fondamenti di Informatica - Prof. Clementini 24


Mascheramento di variabili
• Il parametro o la variabile locale che abbia lo stesso nome di
una variabile esterna causa il mascheramento di quest’ultima
(se ne perde la visibilità)

04/11/2021 Fondamenti di Informatica - Prof. Clementini 25


Mascheramento di variabili
def f2():
def f3():
print("C")
a=3
print(a)
print("B")
a=2
f3()
print(a)

def f1():
print("A")

def main():
f1()
print("D")
f2()
for i in [1,2,3]: f1()

main()

04/11/2021 Fondamenti di Informatica - Prof. Clementini 26


Effetti collaterali nel passaggio di liste
• Se ad una funzione è passata una lista, il parametro non costituisce una
variabile indipendente, ma essenzialmente il parametro diventa un
sinonimo per la lista proveniente dal programma chiamante
• Quindi una modifica al parametro si ripercuote in una modifica alla lista
che è stata passata
def stampa_lista_doppia(lis):
for i in range(len(lis)):
lis[i]=2*lis[i]
print(lis)

lista=[3,4,5,6,7]
stampa_lista_doppia(lista)
print(lista)

04/11/2021 Fondamenti di Informatica - Prof. Clementini 27


Effetti collaterali nel passaggio di liste
• Pertanto, quando si passa una lista bisogna evitare modifiche
indesiderate
• Nella funzione bisogna prima copiare la lista se si intende
modificarla
def stampa_lista_doppia(lis):
lis_copia=lis.copy()
for i in range(len(lis_copia)):
lis_copia[i]=2*lis_copia[i]
print(lis_copia)

lista=[3,4,5,6,7]
stampa_lista_doppia(lista)
print(lista)

04/11/2021 Fondamenti di Informatica - Prof. Clementini 28


Altri esempi di chiamata
A una funzione è possibile passare intere espressioni e non solo valori singoli.

Esempio funzione:

def Somma(x,y):
return x+y

Esempi di chiamata:

Somma(a*b,b+1)

Somma(4,5)

04/11/2021 Fondamenti di Informatica - Prof. Clementini 29


Altri aspetti sull’istruzione return
• Generalmente il return si trova come ultima istruzione di una
funzione, o all’interno di un ramo di un’istruzione di selezione.
• L’istruzione return causa anche l’uscita dall’esecuzione della
funzione: pertanto eventuali istruzioni poste dopo un return non
sarebbero mai eseguite.
• Nell’istruzione return possiamo avere una qualsiasi espressione
che, calcolata, produce il valore restituito dalla funzione.
• Il return può restituire un solo valore.
• Se abbiamo bisogno di far restituire più valori dobbiamo aggregare i
valori all’interno di un’unica variabile strutturata.

04/11/2021 Fondamenti di Informatica - Prof. Clementini 30


Esempio return con più valori
def divisione(dividendo,divisore):
quoziente=dividendo//divisore
resto=dividendo%divisore
return [quoziente,resto]

a=11
b=4
[q,r]=divisione(a,b)
print("quoziente=",q)
print("resto=",r)

04/11/2021 Fondamenti di Informatica - Prof. Clementini 31


Chiamate di funzioni
• la chiamata di una funzione senza return è un’istruzione a sé
stante,
• la chiamata di una funzione con return è sempre utilizzata
all’interno di un’espressione in cui è compatibile l’uso del
valore restituito dalla funzione.

04/11/2021 Fondamenti di Informatica - Prof. Clementini 32


Variabili globali
• Anche se è sconsigliato in generale x=2
utilizzare variabili globali, a volte se
ne rende necessario l’uso def f1():
• Una variabile globale è definita global x
esternamente alle funzioni ed è x=3
visibile e utilizzabile in tutte le
funzioni f1()
• Dall’interno di una funzione per print(x)
accedere alla variabile globale
bisogna fare la dichiarazione
«global»
• Ad esempio, nel codice a fianco la
funzione f1 modifica la variabile
globale x

04/11/2021 Fondamenti di Informatica - Prof. Clementini 33


Esercizi
• Trasformare esercizi già fatti con variabili tipo semplice in
esercizi che usano array e funzioni.

04/11/2021 Fondamenti di Informatica - Prof. Clementini 34


Conversione da base 10 a base qualsiasi

numero

base
quoziente=
numero

quoziente
false
!=0
true
resto=
quoziente%base

resto

quoziente=
quoziente/base

04/11/2021 Fondamenti di Informatica - Prof. Clementini 35


Conversione da base 10 a base qualsiasi

Solo con valori semplici:

numero=int(input("Inserire il numero da convertire"))


base=int(input("Inserire la base di arrivo"))
quoziente=numero
print("risultato (in ordine inverso) =")
while quoziente!=0:
resto=quoziente%base
print(resto)
quoziente=quoziente//base

04/11/2021 Fondamenti di Informatica - Prof. Clementini 36


Conversione da base 10 a base qualsiasi
Con l’uso di una stringa per memorizzare il risultato:

numero=int(input("Inserire il numero da convertire"))


base=int(input("Inserire la base di arrivo"))
quoziente=numero
sequenza=""
while quoziente!=0:
resto=quoziente%base
sequenza=str(resto)+sequenza
quoziente=quoziente//base
print("risultato =",sequenza)

04/11/2021 Fondamenti di Informatica - Prof. Clementini 37


Conversione da base 10 a base qualsiasi
Con una funzione:

def ConvBaseQualsiasi(numero,base):
quoziente=numero
sequenza=""
while quoziente!=0:
resto=quoziente%base
sequenza=str(resto)+sequenza
quoziente=quoziente//base
return sequenza

x=int(input("Inserire il numero da convertire"))


b=int(input("Inserire la base di arrivo"))
ris=ConvBaseQualsiasi(x,b)
print("risultato =",ris)

04/11/2021 Fondamenti di Informatica - Prof. Clementini 38


Conversione da base 10 a base qualsiasi
Con una funzione, per base >10:

def ConvBaseQualsiasi(numero,base):
quoziente=numero;
sequenza=""
while quoziente!=0:
resto=quoziente%base
if resto in range(10):
sequenza=str(resto)+sequenza
elif resto in range (10,16):
carattere=ord('A')+(resto-10)
sequenza=chr(carattere)+sequenza
quoziente=quoziente//base
return sequenza

x=int(input("Inserire il numero da convertire"))


b=int(input("Inserire la base di arrivo"))
ris=ConvBaseQualsiasi(x,b)
print("risultato =",ris)

04/11/2021 Fondamenti di Informatica - Prof. Clementini 39


Conversione da base qualsiasi a base 10

• approccio semplificato 2:
– l’ingresso di ogni cifra avviene nello stesso ordine rispetto al numero
dato, utilizzando la formula di Horner

V ( X ) = cn−1  b n−1 + cn−2  b n−2 + + c1  b1 + c0  b0


= c0 + b  (c1 + c2  b +  + cn −1  b n − 2 )
= c0 + b  (c1 + b  (c2 + c3  b +  + cn −1  b n −3 ))
= c0 + b  (c1 +  + b(cn − 2 + cn −1  b))))

04/11/2021 Fondamenti di Informatica - Prof. Clementini 40


soluzione
N

base

valore=0

I=1
n=int(input("Inserire il numero di cifre"))
base=int(input("Inserire la base di partenza"))
I<=N false
i=1
true valore valore=0
cifra while i<=n:
valore=valore* cifra=int(input("cifra"+str(n-i)))
base+cifra #lettura cifre a partire dalla piu’ significativa
valore=valore*base+cifra
I=I+1
i=i+1
print("risultato =",valore)

04/11/2021 Fondamenti di Informatica - Prof. Clementini 41


Conversione da base qualsiasi a base 10
• Formula di Horner
• Uso di una stringa per il numero da convertire

numero=input("Inserire il numero da convertire")


base=int(input("Inserire la base di partenza"))
n=len(numero)
i=0
valore=0
while i<n:
cifra=int(numero[i])
valore=valore*base+cifra
i=i+1
print("risultato =",valore)

04/11/2021 Fondamenti di Informatica - Prof. Clementini 42


Conversione da base qualsiasi a base 10
• Scrivere la funzione

def ConvBase10(numero,base):
n=len(numero)
i=0
valore=0
while i<n:
cifra=int(numero[i])
valore=valore*base+cifra
i=i+1
return valore

x=input("Inserire il numero da convertire")


b=int(input("Inserire la base di partenza"))
risultato=ConvBase10(x,b)
print("risultato =",risultato)

04/11/2021 Fondamenti di Informatica - Prof. Clementini 43


Conversione da base qualsiasi a base 10
• Funzione con base >10

def ConvBase10(numero,base):
n=len(numero)
i=0
valore=0
while i<n:
if numero[i]>='0' and numero[i]<='9':
cifra=int(numero[i])
elif numero[i]>='A' and numero[i]<='F':
cifra=10+(ord(numero[i])-ord('A'))
valore=valore*base+cifra
i=i+1
return valore

x=input("Inserire il numero da convertire")


b=int(input("Inserire la base di partenza"))
risultato=ConvBase10(x,b)
print("risultato =",risultato)

04/11/2021 Fondamenti di Informatica - Prof. Clementini 44


Conversione di base
1) Scrivere un programma che richiama entrambe le funzioni viste

2) Scrivere un programma che esegue la conversione da base 10


a base qualsiasi per un numero con parte intera e parte
frazionaria

04/11/2021 Fondamenti di Informatica - Prof. Clementini 45


Esempio: funzione fattoriale

04/11/2021 Fondamenti di Informatica - Prof. Clementini 46


Esempio: funzione fattoriale
def fatt(x):
f=1
for i in range(1,x+1):
f=f*i
return f

a=a*fatt(6)
s=fatt(n)/fatt(k)
print(fatt(n))

04/11/2021 Fondamenti di Informatica - Prof. Clementini 47


Funzione verifica numero pari

04/11/2021 Fondamenti di Informatica - Prof. Clementini 48


Funzione verifica numero pari
def pari(n):
if n%2==0:
return True
else:
return False

• Un esempio di chiamata:

a=int(input("numero intero"))
if pari(a):
print("numero pari")
else:
print("numero dispari")

04/11/2021 Fondamenti di Informatica - Prof. Clementini 49


Altri esercizi
Verifica di una matrice diagonale

diag=True
i=0
while i<r and diag:
j=0
while j<c and diag:
if (i!=j and a[i][j]!=0):
diag=False
j=j+1
i=i+1

if diag:
print("La matrice è diagonale")
else:
print("La matrice non è diagonale")

04/11/2021 Fondamenti di Informatica - Prof. Clementini 50


Altri esercizi
Scrivere una funzione booleana per la verifica di una matrice diagonale

def diagonale(a,r,c):
diag=True
i=0
while i<r and diag:
j=0
while j<c and diag:
if (i!=j and a[i][j]!=0):
diag=False
j=j+1
i=i+1
return diag

04/11/2021 Fondamenti di Informatica - Prof. Clementini 51


Altri esercizi
Programma chiamante:

def main():
print ("Verifica di matrice diagonale")
n=int(input("Inserire il numero di righe "))
a=LetturaMatrice(n,n)
print (a)
if diagonale(a,n,n):
print ("La matrice inserita è diagonale")
else:
print ("La matrice inserita non è diagonale")

04/11/2021 Fondamenti di Informatica - Prof. Clementini 52


Proprietà di stringhe: parola palindroma
s=input("parola=")
i=0
j=len(s)-1
palin=True
while i<j and palin:
if s[i]!=s[j]:
palin=False
i=i+1
j=j-1
if palin:
print (s,"è una parola palindroma")
else:
print (s,"non è una parola palindroma")

04/11/2021 Fondamenti di Informatica - Prof. Clementini 53


Funzione di verifica per una parola palindroma
def Palindroma(s):
i=0
j=len(s)-1
palin=True
while i<j and palin:
if s[i]!=s[j]:
palin=False
i=i+1
j=j-1
return palin

• Un esempio di chiamata:

parola=input("parola=")
if Palindroma(parola):
print (parola,"è una parola palindroma")
else:
print (parola,"non è una parola palindroma")

04/11/2021 Fondamenti di Informatica - Prof. Clementini 54


Funzioni ricorsive
• “…quando una def f (x):
funzione ………
richiama se … f(…)…
stessa…” ………

• “una chiamata def f (x):


ricorsiva è posta ………
all’interno di una if condizione:
….f(…)…
istruzione di ………
selezione”
04/11/2021 Fondamenti di Informatica - Prof. Clementini 55
Funzioni ricorsive
• Formulazione ricorsiva
di problemi
• Es. fattoriale:
n
– Formulazione iterativa: n!=  i per n>0, con 0!=1.
i =1

– Formulazione ricorsiva: n!= n  (n − 1)! per n>0, con 0!=1.

04/11/2021 Fondamenti di Informatica - Prof. Clementini 56


Definizione ricorsiva
• Es. n=4 4*3!

3!=3*2!
2!=2*1!
1!=1*0!
0!=1

Quando si arriva alla condizione di 0! si


ritorna indietro calcolando tutti gli altri
fattoriali precedenti

04/11/2021 Fondamenti di Informatica - Prof. Clementini 57


Funzione fattoriale
def fatt(x): Caratteristica di una funzione ricorsiva è che non c'è
un ciclo for.
if x==0: Viene chiamata la funzione fatt con 3!,
successivamente si richiama la funzione con il
f=1 fattoriale di 2 e così via.
else: Le chiamate vengono chiuse al contrario

f=x*fatt(x-1)
return f

04/11/2021 Fondamenti di Informatica - Prof. Clementini 58


Funzione fattoriale
Oppure:

def fatt(x):
if x==0:
return 1
else:
return x*fatt(x-1)

04/11/2021 Fondamenti di Informatica - Prof. Clementini 59


Chiamate ricorsive
def fatt(x):
if x==0: Ogni chiamata ha le sue variabili distinte,
f=1 ognuna appartenente a un valore diverso.
else:
f=x*fatt(x-1)
return f

globale

main fatt(4) fatt(3) fatt(2) fatt(1) fatt(0)

x 4 x 3 x 2 x 1 x 0
fatt(4)
f f f f f 1

fatt(3) fatt(2) fatt(1) fatt(0)

04/11/2021 Fondamenti di Informatica - Prof. Clementini 60


Stampa di caratteri in ordine inverso
def Inverti():
ABC.
c=input() si ritroverà .CBA
if c!='.': Inverti()
Si distinguono i processi prima della
print(c) ricorsione e dopo la ricorsione.

print("inserire un carattere per volta e terminare con il 'punto'")


Inverti()

04/11/2021 Fondamenti di Informatica - Prof. Clementini 61


Funzioni ricorsive su liste
• Una lista ha una definizione ricorsiva:
– Una lista è composta da un elemento seguito da una lista
– Una lista può essere vuota
• Basandoci su questa definizione scriviamo alcune funzioni
ricorsive su liste:
– Stampa lista
– Stampa lista in ordine inverso
– Input valori di una lista
– Creazione della lista inversa

04/11/2021 Fondamenti di Informatica - Prof. Clementini 62


Stampa lista ricorsiva
def stampa(l):
if l!=[]: La stampa ricorsiva si mette subito la condizione di stop,
ovvero se l!=[ dalla lista vuota
print(l[0])
stampa(l[1:])

04/11/2021 Fondamenti di Informatica - Prof. Clementini 63


Stampa lista in ordine inverso ricorsiva
def stampainv(l):
if l!=[]:
stampainv(l[1:]) Si sono invertite le istruzioni rispetto a prima. Se la ricorsione se viene messa
prima si analizzano gli elementi dall'ultimo fino al primo

print(l[0])

04/11/2021 Fondamenti di Informatica - Prof. Clementini 64


Input n valori ricorsiva
def crealista(n):
if n>0:
valore=int(input("valore="))
l=crealista(n-1)
return [valore]+l
else:
return []

04/11/2021 Fondamenti di Informatica - Prof. Clementini 65


Creazione lista inversa ricorsiva
def inversa(l):
if l!=[]:
linv=inversa(l[1:])
return linv+l[0:1]
else:
return []

04/11/2021 Fondamenti di Informatica - Prof. Clementini 66


Numeri di Fibonacci
• Def. ricorsiva:
f0 = 1

f1 = 1

f n = f n−1 + f n−2 n  1

def fib(n):
if n==0 or n==1:
return 1
else:
return fib(n-1)+fib(n-2)

04/11/2021 Fondamenti di Informatica - Prof. Clementini 67


Ogni attivazione richiama due attivazioni, le quali a
sua volta producono 2 ulteriori chiamte, quindi

Albero delle chiamate


rispetto alle chiamte ricorsive di un numero fattoriale
present un numero delle chiamate più elevato. Si ha
un albero delle chiamate che cresce sempre di più.
In questa struttura c'è molta rindondanza ed effetto
indisisderato . Gli intervalli di tempo crescono
sempre di più all'aumentare del numero di chiamate
effettuate. Il tempo di calcolo è troppo elevato si ha
fib(5)
un tempo esponenziale, ad ogni iterazione il tempo
raddoppia ed è inutile perchè ha dei tempi troppo
lunghi. Il tempo di esecuzione di un algoritmo è fib(4) fib(3)
indipendente dalla potenza del calcolatore ma a
livello di funzione matematica che l'algoritmo
presenta. BISOGNA ANDARE A CONSIDERARE IL
TEMPO DI ESECUZIONE. Quindi la funzione
fib(3) fib(2) fib(2) fib(1)
ricorsiva pur essendo molto compatta presenta un
tempo di esecuzione esponenziale, quindi non
conviene utilizzarlo ma risulta più efficace la versione fib(2) fib(1) fib(1) fib(0) fib(1) fib(0)
iterativa che presenta un tempo di esecuzione
lineare.

fib(1) fib(0)

04/11/2021 Fondamenti di Informatica - Prof. Clementini 68


Confronto sperimentale con la versione iterativa

04/11/2021 Fondamenti di Informatica - Prof. Clementini 69


Esercizi
• Calcolare il valore approssimato di un integrale definito con la
formula del trapezio:
𝑏
𝑏 − 𝑎 𝑓 𝑥0 𝑓 𝑥𝑛
න 𝑓 𝑥 𝑑𝑥 = + 𝑓 𝑥1 + ⋯ + 𝑓 𝑥𝑛−1 +
𝑎 𝑛 2 2

04/11/2021 Fondamenti di Informatica - Prof. Clementini 70

Potrebbero piacerti anche