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
© Copyright 2024 Paperzz