Le Funzioni e la Ricorsione
|
|
|
- Gabriella Marchese
- 9 anni fa
- Visualizzazioni
Transcript
1 Aula V Dip. di Matematica G. Castelnuovo Univ. di Roma La Sapienza Le Funzioni e la Ricorsione Igor Melatti Slides disponibili (assieme ad altro materiale) in: melatti/programmazione html Igor Melatti, Le Funzioni e la Ricorsione 1
2 Le funzioni Da adesso in poi, basta esercizi che chiedono di scrivere un programma Si chiederà di scrivere una o più funzioni Inoltre, non si chiederà (quasi) più di leggere un numero da tastiera o scrivere un numero su schermo la lettura da tastiera non servirà (quasi) più perché basta dare i numeri come parametri della funzione la scrittura del risultato su schermo non servirà (quasi) più perché basta dare il numero come valore di ritorno (o output) della funzione Igor Melatti, Le Funzioni e la Ricorsione 2
3 Da così Scrivere un programma che legge da tastiera un numero non negativo x e stampa su schermo la somma delle cifre decimali di x #include <stdio.h> int main() { unsigned x, sum = 0; printf("immettere il numero: "); scanf("%u", &x); printf("la somma delle cifre di %u e : ", x); while (x!= 0) { sum += x%10; x /= 10; } printf("%u\n", sum); } Igor Melatti, Le Funzioni e la Ricorsione 3
4 A così Scrivere una funzione che prende in input un numero non negativo x e restituisce la somma delle cifre decimali di x a a unsigned SommaCifreDec(unsigned n) { } a a a unsigned sum = 0; while (n!= 0) { } sum += n%10; n /= 10; return sum; Igor Melatti, Le Funzioni e la Ricorsione 4
5 A così Per completare il programma (ma solo per vedere qui in laboratorio se gira ): #include <stdio.h> int main() { unsigned x; printf("immettere il numero: "); scanf("%u", &x); printf("la somma delle cifre di %u e : %u\n", x, SommaCifreDec(x)); } Riscrivere usando le funzioni come nel caso precedente tutti gli esercizi di giovedì scorso (modulo vacanze) Igor Melatti, Le Funzioni e la Ricorsione 5
6 Le funzioni ricorsive: ripasso Riscrivere in maniera ricorsiva la funzione SommaCifreDec Vediamo come si ragiona (repetita iuvant) Parametro ricorsivo in questo caso è uno solo (chiamiamolo n), ed è il numero che contiene le cifre ancora da sommare detto in questa maniera, è chiaro che all inizio n è il numero originario (tutte le cifre devono ancora essere sommate), e alla fine n ha una sola cifra Caso base per quanto detto sopra, si ha quando n ha una sola cifra, ovvero quando n 9 qui la somma delle cifre di n e proprio n, quindi si restituisce (o ritorna) n Igor Melatti, Le Funzioni e la Ricorsione 6
7 Le funzioni ricorsive: ripasso Vediamo come si ragiona (continua) Caso ricorsivo si ha quando n ha più cifre, ovvero quando n > 9 (quindi è esattamente la negazione del caso base) qui la somma delle cifre di n può essere vista come la somma dell ultima cifra di n con la somma delle altre cifre di n matematicamente: supponiamo che n si scriva in decimale come n k n k 1...n 1 n 0 esempio: se n =349, allora k = 2 e n 2 =3, n 1 =4, n 0 =9 allora SommaCifreDec(n) = n 0 +SommaCifreDec(n k n k 1...n 1 ) k n i = infatti, SommaCifreDec(n) = i=0 n 0 + n n k 1 + n k = n 0 + (n n k 1 + n k ) = k n 0 + n i = n 0 +SommaCifreDec(n k n k 1...n 1 ) i=1 Igor Melatti, Le Funzioni e la Ricorsione 7
8 Le funzioni ricorsive: ripasso Caso Espressione da restituire Base (n 9) n Ricorsivo (n > 9) n 0 +SommaCifreDec(n k n k 1...n 1 ) Da qui all implementazione basta notare 2 cose: 1. n 0 = n%10 2. n k n k 1...n 1 = n/10 Igor Melatti, Le Funzioni e la Ricorsione 8
9 Implementazione finale unsigned SommaCifreDec(unsigned n) { /* pre: n >= 0 */ /* post: SommaCifreDec(n) = SommaCifreDec(n k n k 1... n 0 ) = if (n <= 9) return n; else /* questo else non e necessario, perche? */ return n%10 + SommaCifreDec(n/10); } kx n i * / i=0 Igor Melatti, Le Funzioni e la Ricorsione 9
10 Verifica Vi si potrebbe chiedere di verificare che la funzione termina sempre E anche che calcola il valore esatto Quest ultima cosa è vera per l analisi matematica fatta sopra La terminazione è data dal fatto che ogni volta a SommaCifreDec gli si passa lo stesso numero privato di una cifra Prima o poi, a forza di togliere, si arriverà ad una cifra sola Ma se si arriva ad una cifra sola allora viene eseguito il caso base Igor Melatti, Le Funzioni e la Ricorsione 10
11 Altro esempio Un numero naturale è divisibile per 3 se e solo se la somma delle sue cifre decimali è divisibile per 3. Scrivere una funzione ricorsiva per decidere se un naturale dato è divisibile per 3. N.B.: è consentito l uso dell operatore modulo % solo per dividere per 10. La funzione che scriveremo (chiamiamola Div3) prenderà in input un naturale n e ritornerà 1 se n è divisibile per 3 e 0 altrimenti char Div3(unsigned n) /* perche char? */ { /* pre: n >= 0 */ /* post: Div3(n) = 1 se e solo se esiste k N tale che 3k = n */ return n%3 == 0; } Igor Melatti, Le Funzioni e la Ricorsione 11
12 Altro esempio Proviamo a ragionare nella stessa maniera di sopra Parametro ricorsivo uno solo (chiamiamolo n), è il numero di cui occorre decidere se è divisibile per 3 o no ancora una volta, all inizio n è il numero originario, e alla fine n ha una sola cifra, ma questa volta si procederà diversamente Caso base si ha quando n ha una sola cifra, ovvero quando n 9 qui n è divisibile per 3 se e solo se n {0, 3, 6, 9}, quindi si restituisce (o ritorna) 1 se e solo se n {0, 3, 6, 9} Caso ricorsivo si ha quando n ha più cifre, ovvero quando n > 9 (di nuovo, è la negazione del caso base) qui n è divisibile per 3 se e solo se la somma delle cifre di n è divisibile per 3 matematicamente, si tratta della proprietà fornita con il testo dell esercizio Igor Melatti, Le Funzioni e la Ricorsione 12
13 Altro esempio Caso Espressione da restituire Base (n 9) n {0, 3, 6, 9} Ricorsivo (n > 9) Div3(SommaCifreDec(n)) Da qui all implementazione basta notare 2 cose: 1. n {0, 3, 6, 9} = (n = 0 n = 3 n = 6 n = 9) 2. SommaCifreDec è già implementata Igor Melatti, Le Funzioni e la Ricorsione 13
14 Implementazione finale char Div3(unsigned n) { /* pre: n >= 0 */ /* post: Div3(n) = 1 se e solo se esiste k N tale che 3k = n */ if (n <= 9) return n == 0 n == 3 n == 6 n == 9; else /* di nuovo, questo else non e necessario */ return Div3(SommaCifreDec(n)); } Igor Melatti, Le Funzioni e la Ricorsione 14
15 Verifica La funzione Div3 calcola il giusto valore perché si basa sulla proprietà data La terminazione è data dal fatto che ogni volta SommaCifreDec ritorna un valore strettamente più piccolo del suo argomento matematicamente: n = 10 k n k n 0 > n k n 0 =SommaCifreDec(n), quindi n >SommaCifreDec(n) N.B.: quanto detto sopra vale solo per numeri composti da almeno 2 cifre decimali, che in effetti è proprio quello che serve (se n ha una sola cifra decimale, la chiamata ricorsiva non viene fatta) Prima o poi, a forza di di passare valori sempre più piccoli, si arriverà ad una cifra sola Ma se si arriva ad una cifra sola allora viene eseguito il caso base Igor Melatti, Le Funzioni e la Ricorsione 15
16 Tutti gli esercizi: funzioni iterative Scrivere una funzione che prende in input un numero non negativo x e stampa su schermo a quanti giorni, ore, minuti e secondi corrispondono x secondi Scrivere una procedura (cioè una funzione che ritorna void) che prende in input 4 numeri non negativi d, h, m, s e dice quanti secondi ci sono in d giorni, h ore, m minuti e s secondi Scrivere una procedura che stampi a video quanti bit e quanti bytes occorrano per i tipi predefiniti del C: int, unsigned, long, float, char... Scrivere 3 funzioni (iterative) che prendano tutte in input 2 interi x e y e poi restituiscano: 1. il prodotto x y, ma senza usare l operatore * 2. la potenza x y, ma senza usare la funzione pow 3. il resto e il quoziente di x/y, ma senza usare né l operatore /, Igor Melatti, Le Funzioni e la Ricorsione 16
17 Tutti gli esercizi: funzioni iterative né l operatore % Riscrivere le funzioni 1 e 2 in maniera che uno tra x e y sia reale (nel caso 2, deve essere per forza la base) Scrivere una funzione che prende in input un intero x e restituisce la somma delle cifre (decimali) di x Riscrivere la funzione di cui sopra facendo sì che prenda in input, oltre ad x, anche un intero b, e che poi consideri le cifre di x rappresentato in base b Igor Melatti, Le Funzioni e la Ricorsione 17
18 Tutti gli esercizi: funzioni iterative Scrivere una funzione iterativa che dato in input un naturale x calcoli la radice digitale di x. La radice digitale di un numero si ottiene sommando le sue cifre (decimali) fino a che non si riducono ad un numero di una sola cifra (decimale) Riscrivere la funzione di cui sopra facendo sì che prenda in input, oltre ad x, anche un intero b, e che poi consideri le cifre di x rappresentato in base b Un numero naturale è divisibile per 3 se la somma delle sue cifre decimali è divisibile per 3. Scrivere una funzione iterativa per decidere se un naturale dato è divisibile per 3. È consentito l uso dell operatore modulo % solo per dividere per 10. Igor Melatti, Le Funzioni e la Ricorsione 18
19 Tutti gli esercizi: funzioni iterative Dato un naturale n, siano si(n) e sp(n) rispettivamente la somma delle cifre di ordine pari e dispari in n. (dove la 0-esima cifra è quella di minor peso). n è divisibile per 11 se il valore assoluto della differenza tra sp(n) e si(n) cioè abs(sp(n)-si(n))) è divisibile per 11. Scrivere una funzione iterativa per decidere se un numero naturale dato è divisibile per 11. È consentito l uso dell operatore modulo % solo per dividere per 10. Igor Melatti, Le Funzioni e la Ricorsione 19
20 Tutti gli esercizi: funzioni ricorsive Scrivere 3 funzioni ricorsive che prendano tutte in input 2 interi x e y e poi restituiscano: 1. il prodotto x y, ma senza usare l operatore * 2. la potenza x y, ma senza usare la funzione pow 3. il resto e il quoziente di x/y, ma senza usare né l operatore /, né l operatore % Riscrivere le funzioni 1 e 2 in maniera che uno tra x e y sia reale (nel caso 2, deve essere per forza la base) Scrivere una funzione ricorsiva che prende in input un intero x e restituisce la somma delle cifre (decimali) di x Riscrivere la funzione di cui sopra facendo sì che prenda in input, oltre ad x, anche un intero b, e che poi consideri le cifre di x rappresentato in base b Igor Melatti, Le Funzioni e la Ricorsione 20
21 Tutti gli esercizi: funzioni ricorsive Scrivere una funzione ricorsiva che dato in input un naturale x calcoli la radice digitale di x. La radice digitale di un numero si ottiene sommando le sue cifre (decimali) fino a che non si riducono ad un numero di una sola cifra (decimale) Riscrivere la funzione di cui sopra facendo sì che prenda in input, oltre ad x, anche un intero b, e che poi consideri le cifre di x rappresentato in base b Un numero naturale è divisibile per 3 se la somma delle sue cifre decimali è divisibile per 3. Scrivere una funzione ricorsiva per decidere se un naturale dato è divisibile per 3. È consentito l uso dell operatore modulo % solo per dividere per 10. Igor Melatti, Le Funzioni e la Ricorsione 21
22 Tutti gli esercizi: funzioni ricorsive (Difficile) Dato un naturale n, siano si(n) e sp(n) rispettivamente la somma delle cifre di ordine pari e dispari in n. (dove la 0-esima cifra è quella di minor peso). n è divisibile per 11 se il valore assoluto della differenza tra sp(n) e si(n) cioè abs(sp(n)-si(n))) è divisibile per 11. Scrivere una funzione ricorsiva per decidere se un numero naturale dato è divisibile per 11. È consentito l uso dell operatore modulo % solo per dividere per 10. Igor Melatti, Le Funzioni e la Ricorsione 22
23 Tutti gli esercizi: funzioni ricorsive Scrivere una funzione ricorsiva che, dato un intero n, restituisca l n-esimo numero di Fibonacci, definito da: f 0 = 0 f 1 = 1 f n = f n 1 + f n 2 (Difficile) In una catena di venditori v 1,...,v n, ogni v i compra da v i 1 al prezzo x e vende a v i+1 al prezzo px (con p > 1...). Il primo venditore vende a y. Scrivere una funzione ricorsiva che dica a quanto vende l n-esimo venditore (v n ). Igor Melatti, Le Funzioni e la Ricorsione 23
Laboratorio di Programmazione Lezione 2. Cristian Del Fabbro
Laboratorio di Programmazione Lezione 2 Cristian Del Fabbro Prossima lezione GIOVEDÌ 29 OTTOBRE 14:00 Input da tastiera package input; import java.io.*; public class Input { public static void main(string[]
ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} }
ERRATA CORRIGE Pulizia del buffer di input: come fare? (1) Dopo aver richiamato getchar() per prelevare un carattere dal buffer di input, inseriamo una seconda chiamata a getchar(), senza assegnare il
radicando. Si ottiene 5 RADICALI Termini a x = indice della radice y = esponente del radicando Esempi: 25 = 5 perché 5 = 25
RADICALI Termini x y a x = indice della radice y = esponente del radicando 25 = 5 perché 5 = 25 5 indica la radice quadrata di 5, non è un numero intero, è decimale, illimitato e non periodico. 16 = 2
Struttura dei programmi C
Programmi C Struttura dei Programmi C Dichiarazione delle variabili Operazioni di Ingresso/Uscita Fondamenti di Informatica 1 Struttura dei programmi C Un programma C deve contenere, nell'ordine: una parte
Qualsiasi programma in C++ segue lo schema:
Qualsiasi programma in C++ segue lo schema: #include // libreria che gestisce flusso di input e output using namespace std; // uso di librerie standard del C++ int main() { // dichiarazioni
Linguaggio C Informatica Grafica
Linguaggio C Informatica Grafica Corsi di Informatica Grafica Prof. Manuel Roveri Dipartimento di Elettronica e Informazione [email protected] Linguaggio C Breve storia Struttura di un programma Variabili
VT = { +, -, *, /, (, ), 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 } VN = {<E>, <T>, <F>, <num>, <cifra>, <cifra-non-nulla> }
Esercizio - Grammatiche (1) Espressioni algebriche G = VT,VN,P,S, dove: VT = { +, -, *, /, (, ), 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 VN = {, ,, , , S = 1 P = { Esercizio
Per gli esercizi sulla algebra booleana, si consiglia di verificare tramite tabelle di verità le equivalenze logiche proposte sulle dispense.
Fondamenti di Informatica - A. Fantechi Raccolta di esercizi Per gli esercizi sulla algebra booleana, si consiglia di verificare tramite tabelle di verità le equivalenze logiche proposte sulle dispense.
Esercizi in Python. Docente: Domenico Daniele Bloisi
Esercizi in Python Docente: Domenico Daniele Bloisi http://profs.scienze.univr.it/~bloisi/asl/asl.html Esercizio 1 Utilizzare il linguaggio di programmazione Python per stampare a video la scritta "prima
Introduzione alla programmazione in linguaggio C
Introduzione alla programmazione in linguaggio C Il primo programma in C commento Header della libreria Funzione principale Ogni istruzione in C va terminata con un ; Corso di Informatica AA. 2007-2008
laboratorio di python
laboratorio di python definizioni di booleani, selezione ed uso degli input 13 Marzo 2019 1/32 Correzione esercizi per oggi esercizio 1 per casa Scrivere una funzione che non ha nessun parametro, non restituisce
ARRAY E STRINGHE. ESERCIZIO 2 Scrivere un programma che calcola il numero di doppie e di dittonghi (2 vocali vicine) presenti in una stringa.
3 ITI - a.s. 2007-2008 Compiti di Informatica ESTATE 2008 ARRAY E STRINGHE Scrivere una funzione che carica da tastiera un array di n elementi e lo stampa invertendo il primo elemento con l'ultimo, il
Laboratorio di Python
Problem solving, Ricorsione, Università di Bologna 13 e 15 marzo 2013 Sommario 1 2 3 4 Errore di semantica Esercizio def vocali(s): voc='' for c in s: if c in 'aeiou': voc=voc+c return voc Cerchiamo di
Esercizi. La funzione swapint() primo tentativo
Politecnico di Milano Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio di array. #include
LIBRERIE STANDARD in C. LIBRERIE STANDARD in C
LIBRERIE STANDARD in C La libreria standard del C è in realtà un insieme di librerie Per usare una libreria, non occorre inserirla esplicitamente nel progetto: ogni ambiente di sviluppo sa già dove cercarle
Un algoritmo realizza una relazione funzionale tra i valori di input e quelli di output
Un algoritmo realizza una relazione funzionale tra i valori di input e quelli di output F = { (s, s ) } per ogni s esiste una e una sola coppia (s, s ). Esempio: un algoritmo che calcola il quadrato di
Breve Manuale di Riferimento sulla Sintassi Linguaggi C++ e FORTRAN
Breve Manuale di Riferimento sulla Sintassi Linguaggi e versione aggiornata al 05/02/2004 Sommario Elementi di Base... 2 Dati, Tipi e Dichiarazioni... 2 Tipi di Dato di Base... 2 Tipi di Dato Strutturati...
Introduzione al linguaggio C Funzioni
Introduzione al linguaggio C Funzioni Violetta Lonati Università degli studi di Milano Dipartimento di Informatica Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica Violetta Lonati
LIBRERIE STANDARD in C
LIBRERIE STANDARD in C La libreria standard del C è in realtà un insieme di librerie Per usare una libreria, non occorre inserirla esplicitamente nel progetto: ogni ambiente di sviluppo sa già dove cercarle
Input/Output di numeri
Input/Output di numeri I/O di numeri Per utilizzare le funzioni di I/O occorre include il file di intestazione (o file header) stdio.h utilizzando all inizio del sorgente la direttiva #include
PROGRAMMAZIONE: La selezione
PROGRAMMAZIONE: La selezione Prof. Enrico Terrone A. S: 2008/09 Le tre modalità La modalità basilare di esecuzione di un programma è la sequenza: le istruzioni vengono eseguite una dopo l altra, riga per
Informatica 1. Prova di recupero 21 Settembre 2001
Informatica 1 Prova di recupero 21 Settembre 2001 Si risolvano i seguenti esercizi. Ai fini della determinazione del voto finale il loro punteggio andrà sommato al punteggio del laboratorio. Il tempo complessivo
Quicksort e qsort() Alessio Orlandi. 28 marzo 2010
Quicksort e qsort() Alessio Orlandi 28 marzo 2010 Intro Quicksort è l algoritmo di ordinamento più implementato, insieme con Mergesort. Tutte le librerie standard UNIX ne prevedono una implementazione.
La gestione dei caratteri in C
in C In C i caratteri sono gestiti mediante variabili di tipo char (interi a 8 bit) Ad ogni carattere corrisponde un codice numerico ASCII (American Standard Code for Information Interchange) Un esempio
2 Operatori matematici e costrutto if
Questa dispensa propone esercizi sulla scrittura di algoritmi, in linguaggio C, utili alla comprensione delle operazioni tra numeri e del costrutto condizionale if. Si introducono anche le due funzioni
Funzioni. Unità 1. Domenico Daniele Bloisi. Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR
Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Domenico Daniele Bloisi Docenti Parte I prof. Silvio Salza [email protected] http://www.dis.uniroma1.it/~salza/fondamenti.htm
Esercitazione 4. Comandi iterativi for, while, do-while
Esercitazione 4 Comandi iterativi for, while, do-while Comando for for (istr1; cond; istr2) istr3; Le istruzioni vengono eseguite nel seguente ordine: 1) esegui istr1 2) se cond è vera vai al passo 3 altrimenti
INFORMATICA DI BASE Linguaggio C Prof. Andrea Borghesan
INFORMATICA DI BASE Linguaggio C Prof. Andrea Borghesan venus.unive.it/borg [email protected] Ricevimento lunedì, prima o dopo lezione 1 Le funzioni in C Le funzioni vengono utilizzate per 3 motivi: Riusabilità
Istruzioni iterative (o cicliche)
Dipartimento di Informatica e Sistemistica Antonio Ruberti Sapienza Università di Roma Istruzioni iterative (o cicliche) Corso di Fondamenti di Informatica Laurea in Ingegneria Informatica (Canale di Ingegneria
Laboratorio di programmazione
Laboratorio di programmazione Lezione II Tatiana Zolo [email protected] 1 IL PROGRAMMA C++ Istruzioni (espressioni terminate da ; ) istruzioni di dichiarazione (es. int x = 0;); istruzioni di assegnamento
Informatica B. Sezione D. Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica
Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica Dipartimento di Elettronica, Informazione e Bioingegneria Informatica B Sezione D Franchi Alessio Mauro,
