Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
1
Tail recursion: esempio
Scrivere una funzione ricorsiva che, dato un array ordinato di interi, determini se l’intero x è presente nell’array. int ricerca_binaria(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_binaria(array, mid+1, b, x); else return ricerca_binaria(array, a, mid-1, x); }
2
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 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
3
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
4
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)); }
5
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, l->el);
6
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)
7
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);
8
Esercizio 4 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)
9
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);
10
Esercizio 5 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.
11
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);
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.