Tail recursion: esempio

Slides:



Advertisements
Presentazioni simili
1 Automazione dellalgoritmo ricorsivo di permutazione eseguita da Mariano Melchiorri.
Advertisements

Uso avanzato di C.
Procedure e funzioni ricorsive
1 Informatica Generale Susanna Pelagatti Ricevimento: Mercoledì ore presso Dipartimento di Informatica, Via Buonarroti,
Grafi Algoritmi e Strutture Dati. Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati 2/ed 2 Copyright © The McGraw.
Lez. 91 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Alberi di ricerca.
La ricorsione Simulazione. Il Main /* Programma che usa una funzione ricorsiva*/ #include #define MAX_N 8 main() int valore, dato; printf(Introduci n:
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Esercizi su alberi binari
Alberi binari Definizione della struttura dati: struct tree { };
Esercizi su alberi binari di ricerca
Esercizi su strutture dinamiche Fondamenti di Programmazione Canale AD a.a. 2009/2010.
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di Programmazione a.a.2009/2010 Prof.ssa Chiara Petrioli Corso.
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2007/2008 Corso di Programmazione 1 a.a.2007/2008 Prof.ssa Chiara Petrioli Corso di Laurea.
Astrazioni sul controllo Iteratori. 2 Nuove iterazioni Definendo un nuovo tipo come collezione di oggetti (p. es., set) si vorrebbe disporre anche di.
CORSO DI PROGRAMMAZIONE II
APPUNTI SUL LINGUAGGIO C
LdL - LP1 - ver. 6 - lez aa Linguaggi di programmazione I La ricorsione Prof. Luigi Di Lascio Lezione 10.
Modello dati ALBERO Albero: Albero: insieme di punti chiamati NODI e linee chiamate EDGES EDGE: linea che unisce due nodi distinti Radice (root): in una.
Modello dati ALBERO Albero: Albero: insieme di punti chiamati NODI e linee chiamate EDGES EDGE: linea che unisce due nodi distinti Radice (root): in una.
Esercizi su pile Scrivere una funzione che restituisca una nuova pila che contiene i valori di una pila in ingresso in ordine inverso. La pila originale.
Esercizi su code Date due code in ingresso a valori interi in ordine crescente, scrivere una funzione che restituisca una terza coda che contenga i valori.
Esercizi su alberi binari
Esercizi FUNZIONI Passaggio di parametri per valore, variabili e tipi locali e globali, prototipo.
Esercizi C sui tipi definiti dall’utente
Politecnico di Milano Esercizi Stringhe Ricerca binaria.
Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio.
Politecnico di Milano Esercizi Preparazione alla prima prova intermedia.
Esercizi C su array e matrici
Le liste dinamiche La ricorsione
Le funzioni.
1.Scrivere una funzione per cercare un numero x in una lista circolare di interi. La funzione deve restituire NULL se il numero non esiste. 2.Scrivere.
1 ListaDiElem Cancella( ListaDiElem lista, TipoElemento elem ) { ListaDiElem puntTemp; if( ! ListaVuota(lista) ) if( lista–>info == elem ) { puntTemp =
15 maggio 2002 Avvisi: Ultima lezione: mercoledì 29 maggio II Esonero: mercoledì 5 giugno, ora da stabilire.
Corso di informatica Athena – Periti Informatici
void binario(int n); …………………
Programmazione di Calcolatori
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2007/2008 Corso di Programmazione 1 a.a.2007/2008 Prof.ssa Chiara Petrioli Corso di Laurea.
Esercizi su File.
Esercizi Liste.
Esercizi su File e Liste
Università degli Studi di BresciaA.A. 2012/2013 Fondamenti di Programmazione Docente: Alessandro SaettiA.A. 2012/2013 Università degli Studi di Brescia.
Grafi Rappresentazione mediante liste di adiacenza:
Tail recursion: esempio
Esercizi La distanza di hamming tra due interi x e y si definisce come il numero di posizioni nella rappresentazione binaria di x e y aventi bit differenti.
Esercizi su alberi binari di ricerca
Alberi binari Definizione della struttura dati: struct tree { };
1 Esempi domande di esame. 2 Dato il seguente programma #include int main(){ int *p,j=9,i=5; p=&j; *p=i; printf("%d %d %d\n", i,j,*p); scanf("%d",p);/*
Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni – BCOR Ingegneria Elettronica – BELR Introduzione al C Esercitazione 5 D. Bloisi, A.
Lezione n° 07 - Esercitazione
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 2 La ricorsione Corso di Informatica 2 a.a. 2003/04 Lezione 2.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 5 Le strutture informative Corso di Informatica 2 a.a. 2003/04 Lezione 5.
Esercitazioni su liste
1 Un esempio con iteratore: le liste ordinate di interi.
Struttura di una lista legata Una lista legata è una variabile strutturata in cui ogni elemento mantiene l’indirizzo (mediante un puntatore) dell’elemento.
Esercizio Si legga una sequenza di numeri interi da tastiera (terminatore: 0), quindi: Creare lista L1 con inserimento in testa; cons Creare lista L2 con.
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
AlgoLab - Pile e Code Pile e code Laboratorio di Algoritmi 02/03 Prof. Ugo de’ Liguoro.
CORSO DI PROGRAMMAZIONE II
Prog2 a.a. 2001/ Albero binario di ricerca Un albero binario di ricerca é un albero binario in cui ogni nodo ha un’etichetta.
1 Il linguaggio C Precisazioni sull’esperienza in laboratorio.
Fondamenti di Informatica
APPUNTI SUL LINGUAGGIO C
Corso di Algoritmi e Strutture Dati APPUNTI SUL LINGUAGGIO C Esercizi su Alberi.
Lezione n. Parole chiave: Corso di Laurea: Insegnamento: Docente: A.A Salvatore Cuomo Esercizi sui dati strutturati 13 Tipi di dati strutturati.
13. Strutture dati dinamiche Ing. Simona Colucci Informatica - CDL in Ingegneria Industriale- A.A
1 MODULO STRUTTURE DATI FONDAMENTALI: Strutture dinamiche classe 4° INDUSTRIALE INFORMATICA Focus on.
comprensione e modifica di codice
Transcript della presentazione:

Tail recursion: esempio Scrivere una funzione ricorsiva che, dato un array ordinato di interi, determini se l’intero x è presente nell’array. int ricerca_lineare(int *array, int a, int b, int x) { int mid = (a+b)/2; if (a > b) return 0; if (array[mid] == x) return 1; else if (array[mid] < x) return ricerca_lineare(array, mid+1, b, x); else return ricerca_lineare(array, a, mid-1, x); }

Esercizi su tail recursion Scrivere una funzione ricorsiva che, data una lista di interi positivi, restituisca il massimo intero nella lista. Implementare la funzione con e senza tail recursion. Scrivere una funzione ricorsiva che, data una lista di interi, restituisca la loro somma. Utilizzare la tail recursion. Scrivere una funzione ricorsiva che restituisce la media degli elementi di una lista di interi positivi. Utilizzare la tail recursion. Scrivere una funzione ricorsiva che stampi il contenuto di una pila. Utilizzare la tail recursion. Scrivere una funzione ricorsiva che converta una lista in una lista circolare. Scrivere una funzione ricorsiva che cerchi un elemento in una lista circolare. Utilizzare la tail recursion. Scrivere una funzione ricorsiva che conti il numero di elementi di una lista circolare. Utilizzare la tail recursion. NOTA: scrivere sempre pre e post condizione di ogni funzione

Esercizio 1 Scrivere una funzione ricorsiva che, data una lista di interi positivi, restituisca il massimo intero nella lista. Implementare la funzione con e senza tail recursion. Pre condizioni: La funzione prende in ingresso una lista di interi positivi Post condizioni: La funzione restituisce l’intero di massimo valore nella lista e 0 se la lista è vuota

Implementazione ricorsiva #define MAX(a, b) (a > b ? a : b) int max(struct list *l) { if (l == NULL) return 0; return MAX(l->el, max(l->next)); }

Implementazione ricorsiva con tail recursion int max(struct list *l, int mx) { if (l == NULL) return mx; if (l->el > mx) mx = l->el; return max(l->next, mx); } int max_tr(struct list *l) return max(l, 0);

Esercizio 3 Scrivere una funzione ricorsiva che restituisce la media degli elementi di una lista di interi positivi. Utilizzare la tail recursion. Pre condizioni: la funzione prende in ingresso una lista di interi positivi Post condizioni: La funzione restituisce la media (somma degli elementi / numero degli elementi)

Svolgimento int avg(struct list *l, int somma, int n) { if (l == NULL) return somma/n; somma += l->el; n++; return avg(l->next, somma, n); } int avg_tr(struct list *l) return avg(l, 0, 0);

Esercizio 4 Scrivere una funzione che stampi il contenuto di una pila. Utilizzare la tail recursion. Pre condizioni: la funzione prende in ingresso una pila Post condizioni: la funzione stampa la pila

Svolgimento void stampa_pila(struct pila *p) { if (!pila_vuota(p)) printf("%d\n", pop(p)); stampa_pila(p); }

Esercizio 5 Scrivere una funzione ricorsiva che converta una lista in una lista circolare. Pre condizioni: la funzione prende in ingresso una lista Post condizioni: la funzione rende la lista circolare (restituisce NULL se la lista è vuota)

Svolgimento void rendi_circolare(struct list *l, struct list *s) { if (l->next == NULL) l->next = s; else rendi_circolare(l->next, s); } void rendi_circolare_tr(struct list *l) if (l == NULL) return NULL; rendi_circolare(l, l);

Esercizio 6 Scrivere una funzione ricorsiva che cerchi un elemento in una lista circolare. Utilizzare la tail recursion. Pre condizioni: la funzione prende in ingresso una lista circolare e un elemento Post condizioni: la funzione restituisce 1 se l’elemento è stato trovato, 0 altrimenti.

Svolgimento int ricerca(struct list *l, struct list *s, int x) { if (l->next == s) return l->el == x; return l->el == x || ricerca(l->next, s, x); } int ricerca_tr(struct list *l, int x) if (l == NULL) return 0; return ricerca(l, l, x);

Esercizio bonus sulle pile Scrivere una funzione che, dato un intero positivo in base 10 e una base, restituisca una stringa con la rappresentazione dell’intero nella nuova base. Utilizzare le pile. Pre condizioni: la funzione prende in ingresso un intero positivo e una base Post condizioni: la funzione alloca e restituisce una stringa contenente la rappresentazione del numero nella nuova base

Svolgimento char *converti(unsigned int k, unsigned int b) { struct pila *p = crea_pila(); int conta = 0; char *s, *rappr; if (k == 0) { conta++; push(p, 0); } while(k > 0) push(p, k % b); k /= b; conta++; } rappr = s = (char *)malloc(conta+1); while(!pila_vuota(p)) int digit = pop(p); if (digit < 10) *s = '0'+digit; else *s = 'A'+digit-10; s++; *s = 0; return rappr;