Lucidi

Correzione esercizi
Problem Solving
Ricorsione e i sotto-problemi
Iterazione condizionata
Laboratorio di Python
Problem solving, Ricorsione, Iterazione condizionata
14 marzo 2014
Laboratorio di Python
Correzione esercizi
Problem Solving
Ricorsione e i sotto-problemi
Iterazione condizionata
Sommario
1
Correzione esercizi
2
Problem Solving
3
Ricorsione e i sotto-problemi
4
Iterazione condizionata
Sintassi ed Esempi
Laboratorio di Python
Correzione esercizi
Problem Solving
Ricorsione e i sotto-problemi
Iterazione condizionata
Esercizi
Lunedì il numero di studenti che avevano consegnato gli esercizi era
13.
Martedì il numero di esercizi ricevuti, compresi i 13 di lunedì, non
arrivava a 20.
Da mercoledì alle 16:40 a giovedì alle 22 ho ricevuto più di 40
consegne.
Il corso viene seguito da più di 100 studenti.
Laboratorio di Python
Correzione esercizi
Problem Solving
Ricorsione e i sotto-problemi
Iterazione condizionata
Errore di semantica
print("Esercizio 6. La funzione richiesta: cambialettera()")
def cambialettera():
s=input('Inserire la parola ')
x=input('Inserire il carattere che si vuole cambiare ')
y=input('Inserire il carattere con cui si vuole sostituire...')
A=''
for C in s:
if C==x:
A=A+y
else:
A=A+C
print('La parola', s ,' e' stata sostituita con la parola',A)
Cosa diceva il testo dell’esercizio?
Cosa non rispecchia le richieste?
Laboratorio di Python
Correzione esercizi
Problem Solving
Ricorsione e i sotto-problemi
Iterazione condizionata
Errore Runtime
Esercizio
def div(x,y):
#controlla se x divide y
if y%x==0:
return True
elif y%x>0:
return False
div(0,3)?
altri problemi?
Laboratorio di Python
Correzione esercizi
Problem Solving
Ricorsione e i sotto-problemi
Iterazione condizionata
Errore di?
Esercizio
def esercizio6_sostituisci(s,a,b):
x=''
for i in range(len(s)):
if s[i]!=a:
x=x+s[i]
else:
x=x+b
print(x)
Laboratorio di Python
Correzione esercizi
Problem Solving
Ricorsione e i sotto-problemi
Iterazione condizionata
Problem solving
Definizione informale
È una attività del pensiero che si mette in atto per raggiungere un
determinato risultato.
Può essere svolta in maniera intuitiva o metodologica.
Fasi del metodo intuitivo:
Individuazione del problema
Suddivisione in sotto-problemi
Formulazione e verifica dell’ipotesi
Valutazione delle soluzioni
Implementazione della soluzione migliore
Verifica dei risultati
Laboratorio di Python
Correzione esercizi
Problem Solving
Ricorsione e i sotto-problemi
Iterazione condizionata
Problem solving e produzione del Software
Problem Solving
Individuazione e suddivisione del problema
Verifica e valutazione delle soluzioni
Implementazione della soluzione
Verifica dei risultati
Produzione del Software
Analisi
Progettazione
Implementazione
Debugging
Tabella: Problem solving vs produzione del Software
Laboratorio di Python
Correzione esercizi
Problem Solving
Ricorsione e i sotto-problemi
Iterazione condizionata
Strumenti per la suddivisione in sotto-problemi
Analizzando il problema ci si può accorgere che questo sia
suddivisibile in problemi più semplici
Ogni paradigma di programmazione prevede diverse tecniche
per raggiungere questo obiettivo:
Il paradigma di programmazione imperativo suddivide il programma
in funzioni raggruppate in moduli
Il paradigma ad oggetti progetta classi che sono raggruppate in
package
Laboratorio di Python
Correzione esercizi
Problem Solving
Ricorsione e i sotto-problemi
Iterazione condizionata
Esercizio
Definire una funzione che presi come parametri (a,b,c) restituisca gli
intervalli di valori in cui risulta essere verificata la disequazione
ax 2 + bx + c > 0.
Come possiamo risolvere questo problema?
Può essere suddiviso in sotto problemi?
Possiamo utilizzare riusare del codice?
Laboratorio di Python
Correzione esercizi
Problem Solving
Ricorsione e i sotto-problemi
Iterazione condizionata
Disequazione
import equazione_sec_grado
def disequazione(a,b,c):
x1,x2=equazione_sec_grado.equazione_sec_grado(a,b,c)
if x1 is not None and x2 is not None:
if a>0:
print ("x<", x1, "and x>", x2)
else:
print (x1,"<x<",x2)
elif x1 != "l'equazione e' impossibile" and x1!="l'equazione e'
indeterminata" and x2 is None:
if b>=0:
print ("x>",x1)
else:
print ("x<", x1)
elif x1== "l'equazione e' indeterminata" and x2 is None:
print("mai")
elif x1=="l'equazione e' impossibile" and x2 is None:
if a>0:
print ("sempre")
else:
print ("mai")
Laboratorio di Python
Correzione esercizi
Problem Solving
Ricorsione e i sotto-problemi
Iterazione condizionata
Ricorsione e la scomposizione in sotto-problemi
Una funzione matematica è definita ricorsivamente quando nella sua
definizione compare un riferimento a se stessa
Operativamente, risolvere un problema con un approccio
ricorsivo comporta:
l’identificazione di un ’caso base’ (n = n0 ) in cui la soluzione sia
nota
esprimere la soluzione al caso generico n con (n ≥ n0 ) mediante la
soluzione allo stesso problema basandosi su uno o più casi
precedenti (n − 1, n − 2, · · · ).
La ricorsione è basata sul principio di induzione dei numeri Naturali.
Laboratorio di Python
Correzione esercizi
Problem Solving
Ricorsione e i sotto-problemi
Iterazione condizionata
Principio di induzione e ricorsione
Una successione di proposizioni logiche (Pn )n∈N è una
successione di affermazioni con identico predicato P riferito ad
espressioni dipendenti da un numero naturale n.
Principio di induzione
Data Pn una successione di proposizioni logiche tale che:
Sia Pn0 è una proprietà vera per n0 ∈ N (caso base)
e Pnk è vera per nk ≥ n0 implica che Pnk +1 è vera (passo induttivo)
Possiamo dire che: P(n) è vera per ogni n ≥ n0 È il principio su cui si
basa la ricorsione
Laboratorio di Python
Correzione esercizi
Problem Solving
Ricorsione e i sotto-problemi
Iterazione condizionata
Come definire una funzione ricorsiva
Quindi per definire una funzione ricorsiva bisogna:
individuare il caso base di cui si ha una soluzione
cogliere il passo induttivo, esprimendo la stessa funzione per un
generico n rispetto a uno o più soluzioni precedenti
Utilizzando la ricorsione si può testare la nostra funzione usando la
dimostrazione per induzione
Laboratorio di Python
Correzione esercizi
Problem Solving
Ricorsione e i sotto-problemi
Iterazione condizionata
Esempio funzione ricorsiva
def palin(s):
x=len(s)
if x==0 or x==1:
return 'palindroma'
if s[0]==s[x-1]:
return palin(s[1:x-1])
else:
return 'non palindroma'
Laboratorio di Python
Correzione esercizi
Problem Solving
Ricorsione e i sotto-problemi
Iterazione condizionata
Esempio
Alice distribuisce i suoi dadi colorati (r ) in un numero n di scatole.
Alice li distribuisce in modo tale che in ogni scatola ci sia un diverso
numero di dadi colorati, e ne sia presente almeno uno in ogni scatola.
Qual è il numero minimo di dadi colorati posseduti da Alice?
Individuiamo le possibili soluzioni a questo problema.
Laboratorio di Python
Correzione esercizi
Problem Solving
Ricorsione e i sotto-problemi
Iterazione condizionata
Soluzioni
1
Metodo iterativo
2
Metodo ricorsivo
3
Applicazione di una formula
Laboratorio di Python
Correzione esercizi
Problem Solving
Ricorsione e i sotto-problemi
Iterazione condizionata
Soluzioni
1
Possiamo mettere tutte le scatole in fila e poi inseriamo un dato
in ogni scatola, finite le scatole riparto con la stessa operazione
partendo dalla seconda scatola e così fino all’ultima.
2
Se ho una scatola allora il numero di dati sarà 1. Se ho un
numero n di scatole allora il mio numero totale di dadi sarà il mio
numero n sommato al numero di dati che avrei avuto con n − 1
scatole.
Ci potremmo accorgere che questo non vuol dire altro che
applicare la formula della somma dei primi n numeri naturali, e
quindi basterà restituire il risultato di questa formula n ∗ (n + 1)/2
3
Laboratorio di Python
Correzione esercizi
Problem Solving
Ricorsione e i sotto-problemi
Iterazione condizionata
I dadi di alice
def dadi_alice(n):
if n<=0:
return ('errore')
else:
s=0
dadi_in_scatola=range(1,n+1)
for i in dadi_in_scatola:
s=s+i
return s
def dadi_alice_ric(n):
if n<=0:
return('errore')
if n==1:
return 1
else:
return(n+dadi_alice_ric(n-1))
def dadi_alice_formula(n):
if n<=0:
return ('errore')
else:
return(n*(n+1)//2)
Laboratorio di Python
Correzione esercizi
Problem Solving
Ricorsione e i sotto-problemi
Iterazione condizionata
Testiamo le soluzioni
Proviamo le nostre funzioni con diversi dati
alice(3), alice(10), alice (100)
vediamo qualche differenza percettibile nell’esecuzione dei nostri
programmi?
Laboratorio di Python
Correzione esercizi
Problem Solving
Ricorsione e i sotto-problemi
Iterazione condizionata
Esempio di Ricorsione
Data la serie di Fibonacci così definita:
F0 = 1
F1 = 1
Fn = Fn−1 + Fn−2
Scrivere una funzione che prenda come parametro n, dove tale
parametro rappresenta l’ennesimo valore nella funzione di fibonacci
(Fn ).
Laboratorio di Python
Correzione esercizi
Problem Solving
Ricorsione e i sotto-problemi
Iterazione condizionata
Sintassi ed Esempi
Outline
1
Correzione esercizi
2
Problem Solving
3
Ricorsione e i sotto-problemi
4
Iterazione condizionata
Sintassi ed Esempi
Laboratorio di Python
Correzione esercizi
Problem Solving
Ricorsione e i sotto-problemi
Iterazione condizionata
Sintassi ed Esempi
Iterazione Sintassi
while <condizione>:
<istruzioni_while>
while: indica l’operatore di iterazione condizionata.
condizione: è l’espressione booleana che viene controllata la
prima volta che si incontra l’istruzione while e ogni volta che si
conclude la sequenza di <istruzioni_while>
istruzioni_while: sono l’insieme di istruzioni che vengono
eseguite se e soltanto se risulta True la condizione
Attenzione:
Se si usa l’iterazione condizionata bisogna verificare che
l’espressione presente nella condizione venga modificata
all’interno del blocco <istruzioni_while>
Laboratorio di Python
Correzione esercizi
Problem Solving
Ricorsione e i sotto-problemi
Iterazione condizionata
Sintassi ed Esempi
Iterazione esempio
def menu():
print('Seleziona 1 per calcolare la somma dei primi n numeri')
print('Seleziona 2 per calcolare le soluzioni della disequazione')
print('Seleziona 3 per calcolare l''equazione di secondo grado')
print('Seleziona qualsiasi altro carattere o numero per uscire')
x= int(input('Digita la tua scelta'))
while 1<=x<=3:
if x==1:
a=somma_nat_input()
print(somma_nat(a))
x= int(input('Digita la tua scelta'))
elif x==2:
a,b,c=diseq_sec_grad_input()
print(diseq_sec_grado(a,b,c))
x= int(input('Digita la tua scelta'))
elif x==3:
a,b,c=equazione_sec_grad_input()
print(equazione_sec_grad(a,b,c))
x= int(input('Digita la tua scelta'))
else:
break
Laboratorio di Python
Correzione esercizi
Problem Solving
Ricorsione e i sotto-problemi
Iterazione condizionata
Sintassi ed Esempi
Break
break: si trova annidato in un ciclo (for while). Interrompe
l’esecuzione del ciclo
Laboratorio di Python
Correzione esercizi
Problem Solving
Ricorsione e i sotto-problemi
Iterazione condizionata
Sintassi ed Esempi
Esempi
Scrivere una funzione che dato un numero mi restituisca tutti i
suoi divisori.
Utilizzare il ciclo for e while
Laboratorio di Python
Correzione esercizi
Problem Solving
Ricorsione e i sotto-problemi
Iterazione condizionata
Sintassi ed Esempi
Soluzione Divisori
for
def divisori(x):
for i in range(1,x+1):
if x%i==0:
print(i)
var: in questo esempio è chiamata i. Per ogni i appartenente alla
tupla si esegue l’istruzione condizione: < if x%i==0: print(i)>
sequenza: è creata dalla funzione range(x+1) che crea un tipo
range. Quindi si eseguono le iterazioni per i ∈ {1, · · · , x}.
istruzioni_for: se il modulo della divisione tra x e i è 0 allora
significa che i divide x e quindi lo stampo col comando print().
(perché non usiamo return?)
Laboratorio di Python
Correzione esercizi
Problem Solving
Ricorsione e i sotto-problemi
Iterazione condizionata
Sintassi ed Esempi
Soluzione Divisori
while
def divisori(x):
i=1
while i<=x :
if x%i==0:
print(i)
i+=1
i viene inizializzata
si implementa il ciclo col controllo su i e x
si verifica la condizione di divisore
si incrementa i
Laboratorio di Python
Correzione esercizi
Problem Solving
Ricorsione e i sotto-problemi
Iterazione condizionata
Sintassi ed Esempi
While e for a confronto
(a)
(b)
Figura: (a) Diagramma di flusso While. (b) Diagramma di flusso For.
Laboratorio di Python
Correzione esercizi
Problem Solving
Ricorsione e i sotto-problemi
Iterazione condizionata
Sintassi ed Esempi
Confronto
Il while e il for sono equivalenti?
Laboratorio di Python
Correzione esercizi
Problem Solving
Ricorsione e i sotto-problemi
Iterazione condizionata
Sintassi ed Esempi
Esercizi a casa
Scrivere una funzione che presi due numeri come parametri
della funzione mi stampi il MCD tra i due numeri. Usare ciclo for
e while
Scrivere una funzione che preso un numero come parametro
restituisca True se è primo, e False altrimenti. Usare ciclo for e
while
Scrivere una funzione che preso un numero come parametro mi
stampi tutti i numeri primi che lo dividano. Usare ciclo for e while
Scrivere una funzione che prese in input due stringhe le stampi
ordinate in ordine alfabetico.
Laboratorio di Python
Correzione esercizi
Problem Solving
Ricorsione e i sotto-problemi
Iterazione condizionata
Sintassi ed Esempi
Esercizi a casa
Scrivere un unico programma, che attraverso un menù di
selezione restituisca i risultati delle funzioni che seguono, senza
uscire dal programma se non selezionando il numero 4.
la somma dei primi n numeri pari, dove n è richiesto in input
(soluzione iterativa con for)
la somma dei primi n numeri dispari, dove n è richiesto in input
(soluzione iterativa con while)
la serie geometrica di n numeri, dove n è richiesto in input
(soluzione ricorsiva)
Inviate gli esercizi svolti a: [email protected]
Laboratorio di Python
Correzione esercizi
Problem Solving
Ricorsione e i sotto-problemi
Iterazione condizionata
Sintassi ed Esempi
Cosa abbiamo fatto?
1
Correzione esercizi
2
Problem Solving
3
Ricorsione e i sotto-problemi
4
Iterazione condizionata
Sintassi ed Esempi
Laboratorio di Python