Laboratorio 09. Programmazione - CdS Matematica. Ivano Lauriola 16 gennaio 2018

Documenti analoghi
Laboratorio 8. Programmazione - CdS Matematica. Mirko Polato 15 Dicembre 2015

Laboratorio 8. Programmazione - CdS Matematica. Marco Virgulin 13 Gennaio 2015

Laboratorio 10. Programmazione - CdS Matematica. Michele Donini, Marta Gatto, Mirko Polato 19 gennaio 2016

Laboratorio 08. Programmazione - CdS Matematica. Luca Righi 9 gennaio 2018

alberi binari e ricorsione

Laboratorio 07. Programmazione - CdS Matematica. Michele Donini 10 dicembre 2015

Lezione 9 Alberi binari: visite ed esercizi

Laboratorio di Python

GLI ALBERI BINARI DI RICERCA. Cosimo Laneve

Esercizi di Programmazione Prolog

Laboratorio di Python

Laboratorio di Python

Laboratorio di Python

PROGRAMMAZIONE II canale A-D luglio 2008 TRACCIA DI SOLUZIONE

Lezione 7 Alberi binari: visite e alberi di ricerca

Moltiplicazione veloce di interi

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

d. Cancellazione del valore 5 e. Inserimento del valore 1

Esercizi su alberi binari

INFORMATICA DI BASE Linguaggio C Prof. Andrea Borghesan

Esercizio. 2 i=i*2) j=j*2)

Inserimento in una lista ordinata

Laboratorio di Python

Laboratorio di Python

Laboratorio di Algoritmi

liceo B. Russell PROGRAMMAZIONE INDIRIZZO: SCIENTIFICO SCIENZE APPLICATE BIENNIO: SECONDA DISCIPLINA: INFORMATICA

Laboratorio di Python

Corso di Programmazione

In questa lezione Alberi binari di ricerca: la cancellazione

Espressioni aritmetiche

Laboratorio di Python

Algoritmi e Strutture Dati & Laboratorio di Algoritmi e Programmazione

Note per la Lezione 4 Ugo Vaccaro

Divide et impera su alberi

Alberi e alberi binari I Un albero è un caso particolare di grafo

Laboratorio di Python

Alberi binari. Esercizi su alberi binari

Dati e Algoritmi I (Pietracaprina) Esercizi su Alberi Binari di Ricerca e (2,4)-Tree

Esercitazione 5. Procedure e Funzioni Il comando condizionale: switch

Corso di Programmazione

Laboratorio di Python

Regole del Sette e mezzo

ELEMENTI DI INFORMATICA L-B. Ing. Claudia Chiusoli

csp & backtracking informatica e laboratorio di programmazione Alberto Ferrari Informatica e Laboratorio di Programmazione

Esercitazioni di Fondamenti di Informatica - Lez /12/2018

Università degli Studi di Camerino Laurea in Informatica Prima Prova Parziale del corso di Algoritmi e Strutture Dati

Laboratorio di Python

Programmare. Definire una sequenza di istruzioni che specificano come effettuare una elaborazione

Algoritmi e Strutture Dati

Laboratorio di Informatica

Corso di Programmazione

Algoritmi e Strutture Dati

Alberi e alberi binari I Un albero è un caso particolare di grafo

Algoritmi e Strutture Dati

Strutture dati Alberi binari

Programmazione Funzionale

Indici con gli alberi

Esercizi su Scratch. Esegui la Somma e il Prodotto dei numeri inseriti in Input fino a che non inserisco la vocale e.

RICERCA BINARIA...1 ALBERO BINARIO DI RICERCA (ABR)...3 RICORSIONE...4 ESEMPI DI RICORSIONE IN VISUAL BASIC...5 ESEMPI DI RICORSIONE IN C / C++...

Regole dei Mazzetti. Il mazzo di carte

Albero binario. Alberi binari (introduzione) Terminologia. Alberi di ricerca binaria (BST)

Facoltà di ECONOMIA Corso di Statistica a.a. 2005/2006 Esame del 27/09/2006 Calcolo delle Probabilità e Inferenza

PSPACE completezza. Un linguaggio A è PSPACE completo se. 1. A è in PSPACE, cioè esiste una TM T che accetta A con complessità di spazio polinomiale.

Ripasso di programmazione ricorsiva

Implementazione dell albero binario in linguaggio C++

Programmazione Definizione di nuovi tipi

Un esempio di mutua ricorsione

Laboratorio 05b. Programmazione - CdS Matematica. Lauriola Ivano 13 dicembre 2016

Esercizi su ABR. Prof. E. Fachini - Intr. Alg.!1

Informatica Generale Andrea Corradini Algoritmi: ordinamento per inserimento e ricorsione

Esercitazione 8. Corso di Tecniche di programmazione. Laurea in Ingegneria Informatica

Esercizi vari. Alberto Montresor. 19 Agosto, 2014

Fondamenti di Informatica T-1 Modulo 2

Multi-way search trees

Corso di Fondamenti di Programmazione canale E-O. Un esempio. Funzioni ricorsive. La ricorsione

Risoluzione di un problema

Alberi Binari di Ricerca

CENNI MINIMI DI PROGRAMMAZIONE FUNZIONALE IN PYTHON - V. 0.3

Alberi. Gli alberi sono una generalizzazione delle liste che consente di modellare delle strutture gerarchiche come questa: Largo. Fosco.

Esercizi su BST. IASD a.a A. De Bonis

Pensiero Algoritmico. Lezione 3 23 Novembre Ripasso. Anatomia di un programma. Anatomia di un programma. Ozalp Babaoglu Università di Bologna

Ambienti di Programmazione per il Software di Base

Programmazione Procedurale in Linguaggio C++

Esercizi riassuntivi (Fondamenti di Informatica 2 Walter Didimo) Soluzioni

Ing. Lorenzo Vismara

Alberi. Strutture dati: Alberi. Alberi: Alcuni concetti. Alberi: definizione ricorsiva. Alberi: Una prima realizzazione. Alberi: prima Realizzazione

laboratorio di python

Laboratorio Programmazione Anno Lezione 3

Laboratorio di Python

Esercitazione 5. Procedure e Funzioni Il comando condizionale: switch

Laboratorio di Python

Programmare. Definire una sequenza di istruzioni che specificano come effettuare una elaborazione

UNIVERSITÀ DEGLI STUDI DI PAVIA FACOLTÀ DI INGEGNERIA. Matlab: esempi ed esercizi

Esercizio. Esempio n= sommapari= , sommadispari=7+4+1

L albero e un tipo astratto di dati usato per rappresentare relazioni gerarchiche.

Transcript:

Laboratorio 09 Programmazione - CdS Matematica Ivano Lauriola 16 gennaio 2018

Binary Search Tree

Alberi binari di ricerca Gli alberi binari di ricerca (binary search trees, BST), detti anche alberi ordinati, sono particolari alberi binari con la seguente proprietà: il valore di ogni nodo è maggiore del valore di tutti i nodi del sotto-albero sinistro e minore del valore di tutti i nodi del sotto-albero destro. 1

Classe Albero Definire la classe Albero (binario). È sufficiente definire il solo costruttore. 2

Classe Albero Definire la classe Albero (binario). È sufficiente definire il solo costruttore. class Albero: def init (self,val=none,sx=none,dx=none): self.val = val self.sx = sx self.dx = dx 2

Generazione BST Definire la funzione bst_ins(t,v) (esterna alla classe Albero) che inserisca il valore v nell albero T (anche vuoto) mantenendo la proprietà dei BST. La funzione deve ritornare l albero con il nuovo valore inserito. 3

Generazione BST Definire la funzione bst_ins(t,v) (esterna alla classe Albero) che inserisca il valore v nell albero T (anche vuoto) mantenendo la proprietà dei BST. La funzione deve ritornare l albero con il nuovo valore inserito. def bst_ins(t,v): if not T: return Albero(v) if T.val>v: T.sx = bst_ins(t.sx,v) if T.val<v: T.dx = bst_ins(t.dx,v) return T 3

Funzione di stampa Definire una funzione print_lista_albero(t) che stampa a video gli elementi contenuti in un albero BST ordinati in modo crescente. 4

Funzione di stampa Definire una funzione print_lista_albero(t) che stampa a video gli elementi contenuti in un albero BST ordinati in modo crescente. def print_lista_albero(t): if not T: return if T.sx: print_lista_albero(t.sx) print T.val if T.dx: print_lista_albero(t.dx) 4

Funzione di ricerca (valore esatto) Definire la funzione di ricerca bst_search(t, v) di un elemento v in un BST T: se l elemento cercato esiste ritorna il sotto-albero che ha v come radice, altrimenti ritorna None. 5

Funzione di ricerca (valore esatto) Definire la funzione di ricerca bst_search(t, v) di un elemento v in un BST T: se l elemento cercato esiste ritorna il sotto-albero che ha v come radice, altrimenti ritorna None. def bst_search(t, v): if not T: return None if T.val==v: return T if T.val>v: return bst_search(t.sx,v) return bst_search(t.dx,v) 5

Calcolo del numero di ricorsioni Calcolare il numero di chiamate ricorsive necessario per la ricerca di un valore contenuto in un intervallo. Suggerimento: definire una variabile globale che faccia da contatore delle chiamate ricorsive alla funzione bst_search_intervallo. conta_iterazioni =... def bst_search_intervallo(t, a, b): global conta_iterazioni... 6

Calcolo del numero di ricorsioni Calcolare il numero di chiamate ricorsive necessario per la ricerca di un valore contenuto in un intervallo. Suggerimento: definire una variabile globale che faccia da contatore delle chiamate ricorsive alla funzione bst_search_intervallo. conta_iterazioni = 0 def bst_search_intervallo(t, a, b): global conta_iterazioni conta_iterazioni = conta_iterazioni + 1 if not T: return None if T.val>=a and T.val<=b: return T.val if T.val>b: return bst_search_intervallo(t.sx,a,b) return bst_search_intervallo(t.dx,a,b) 7

Esercizi su ricorsione ed alberi

Esercizio 1 Scrivere una funzione ricorsiva che, dato in input un intero positivo, ritorni True se e solo se tale valore è pari. Non si possono utilizzare operatori di moltiplicazione, divisione e resto. 8

Esercizio 1 Scrivere una funzione ricorsiva che, dato in input un intero positivo, ritorni True se e solo se tale valore è pari. Non si possono utilizzare operatori di moltiplicazione, divisione e resto. def even(x): return True if not x else not even(x-1) 8

Esercizio 2 Descrivere PRE e POST condizioni della seguente funzione: def c(a): return True if not a else c(a.sx)!= c(a.dx) 9

Esercizio 2 - soluzione PRE: a è un albero binario anche vuoto POST: ritorna True sse il numero di nodi dell albero è pari DIM: POST(c(None)) : 0 nodi nell albero, ritorna True. PRE(a.sx) e PRE(a.dx) : valgono perché a non è vuoto, di conseguenza a.sx e a.dx sono due sotto-alberi validi. POST(c(a)) : assumendo a non vuoto, il numero dei nodi in esso è pari se e solo se la somma del numero di nodi nei sottoalberi destro e sinistro è dispari, ovvero quando i risultati delle invocazioni ricorsive applicate ad a.sx ed a.dx sono diversi, cioè uno è True (pari) ed uno False (dispari). Siccome bisogna considerare anche il nodo rappresentato da a, interviene la negazione. 10

Esercizio 3 Dato un Albero binario creare una funzione nodes_lev(tree, lev) che restituisce il numero di nodi presenti al livello lev nell albero. 11

Esercizio 3 Dato un Albero binario creare una funzione nodes_lev(tree, lev) che restituisce il numero di nodi presenti al livello lev nell albero. Soluzione: class Tree(): def init (self, val=none, sx=none, dx=none): self.val = val self.sx = sx self.dx = dx def nodes_lev(tree, lev): if (tree == None or lev < 0): return 0 if lev == 0: return 1 return nodes_lev(tree.dx, lev-1)+nodes_lev(tree.sx, lev-1) 11

Esercizio 4 Dato un Albero binario creare una funzione ricorsiva average(tree) che restituisce la coppia (µ, σ) dove µ è il valore medio dei valori dei nodi presenti nell albero tree e σ è il numero dei nodi contenuti in tale albero. Si assume che i valori all interno dell albero siano interi. 12

Esercizio 4 - Soluzione class Tree(): def init (self, val=none, sx=none, dx=none): self.val = val self.sx = sx self.dx = dx def average(tree): if tree == None: return (0.0, 0) sm, sc = average(tree.sx) dm, dc = average(tree.dx) cnt = sc + dc + 1 return (sm*sc + dm*dc + tree.val) / float(cnt), cnt 13

Esercizi di ripasso

Esercizio 5 Scrivere un descrittore di lista che crea una matrice (lista di liste) quadrata con 7 righe, tale che ogni elemento rappresenta la sua distanza dalla diagonale. Esempio, matrice 3x3: [[0,1,2],[1,0,1],[2,1,0]]. 14

Esercizio 5 Scrivere un descrittore di lista che crea una matrice (lista di liste) quadrata con 7 righe, tale che ogni elemento rappresenta la sua distanza dalla diagonale. Esempio, matrice 3x3: [[0,1,2],[1,0,1],[2,1,0]]. Soluzione: [[abs(i-j) for i in range(7)] for j in range(7)] 14

Esercizio 6 Date le seguenti istruzioni, dire senza eseguire, quale sarà il valore contenuto nella variabile t. x = 1 y = 2 t = (x, y*x, x*x, [y,3]) x = x * t[2] t[3][1] = x t[3].extend([x, y]) y = x**2 + t[1] t[3][3] -= 1 15

Esercizio 6 Date le seguenti istruzioni, dire senza eseguire, quale sarà il valore contenuto nella variabile t. x = 1 y = 2 t = (x, y*x, x*x, [y,3]) x = x * t[2] t[3][1] = x t[3].extend([x, y]) y = x**2 + t[1] t[3][3] -= 1 Soluzione: t = (1, 2, 1, [2, 1, 1, 1]) 15

Esercizio 6 - Spiegazione (1/5) x = 1 y = 2 t = (x, y*x, x*x, [y,3]) 16

Esercizio 6 - Spiegazione (2/5) x = x * t[2] t[3][1] = x 17

Esercizio 6 - Spiegazione (3/5) t[3].extend([x, y]) 18

Esercizio 6 - Spiegazione (4/5) y = x**2 + t[1] 19

Esercizio 6 - Spiegazione (5/5) t[3][3] -= 1 20

Esercizio 7 Date le seguenti istruzioni, dire senza eseguire, quale sarà il valore contenuto nella variabile x. x = [42] for i in range(4): y = x x[0] = i x = [x, y] 21

Esercizio 7 Date le seguenti istruzioni, dire senza eseguire, quale sarà il valore contenuto nella variabile x. x = [42] for i in range(4): y = x x[0] = i x = [x, y] Soluzione: x = [[3, [2, [1, [0]]]], [3, [2, [1, [0]]]]] 21

Esercizio 7 - Spiegazione (1/5) Situazione iniziale: x = [42] 22

Esercizio 7 - Spiegazione (1/5) Situazione iniziale: x = [42] Ciclo for per i {0, 1, 2, 3}: for i in range(4): 22

Esercizio 7 - Spiegazione (2/5) All interno del ciclo for con i = 0 y = x x[0] = i x = [x, y] 23

Esercizio 7 - Spiegazione (3/5) All interno del ciclo for con i = 1 y = x x[0] = i x = [x, y] 24

Esercizio 7 - Spiegazione (4/5) All interno del ciclo for con i = 2 y = x x[0] = i x = [x, y] 25

Esercizio 7 - Spiegazione (5/5) All interno del ciclo for con i = 3 y = x x[0] = i x = [x, y] 26

Esercizio 8 Creare una classe che gestisca una partita a Sette e Mezzo. Regole base: si gioca con un mazzo di carte all italiana, ovvero 40 carte con 4 semi: bastoni, spade, denari e coppe; ogni carta vale quanto il numero che rappresenta ad eccezione delle figure (i.e., fante(8), cavallo(9) e re(10)) che valgono 1 2 ; il gioco si svolge tra giocatore e banco: vince chi possiede come somma delle proprie carte il valore più vicino ( ) al 7 1 2. Chi lo supera sballa e perde; il giocatore riceve carte fintanto che lo vuole o sballa; il banco (CPU) accetta carte fintanto che non ha un valore 5 1 2 ; 27

Esercizio 8 Viene richiesto di: creare una classe che gestisca il gioco per un numero di turni fissato; ogni turno deve: assegnare una carta a banco e giocatore (il giocatore deve conoscere anche la carta del banco); chiedere all utente se vuole carta o si ferma, fino a che non si ferma o sballa; successivamente, se il giocatore non ha sballato, pesca le carte al banco fino a che non ha un valore 5 1 2. in caso di stessi punti (senza essere sballati) vince il banco. Se il giocatore sballa, il banco vince senza pescare altre carte; finiti i turni: dire chi ha vinto più mani. 28

Esercizio 8 La soluzione è liberamente scaricabile al link: http://www.math.unipd.it/~mpolato/didattica/7emezzo.py 29