esercizio: punti e segmenti - carlo strapparava · 1 carlo strapparava - informatica esercizio:...
Post on 24-Jul-2020
2 Views
Preview:
TRANSCRIPT
1
Carlo Strapparava - Informatica
Esercizio: punti e segmenti
! Punti e segmenti nel piano,con data abstraction
Carlo Strapparava - Informatica
Esercizio: punti e segmenti! Punti e segmenti nel piano,
con data abstraction! Lunghezza di un segmento
! Data abstraction:
! Segmento" Costruttore
make-seg pt1 pt2
" Selettoristart-point segend-point seg
! Punto" Costruttore
make-point x y
" Selettorix-coor pointy-coor point
x1 x2
y1
y2
!
l = (x2" x
1)2
+ (y2" y
1)2
2
Carlo Strapparava - Informatica
Esercizio: punti e segmenti(define (segment-length segment)
(let ((dx (- (x-coord (end-point segment))
(x-coord (start-point segment))))
(dy (- (y-coord (end-point segment))
(y-coord (start-point segment)))))
(sqrt (+ (square dx) (square dy)))))
(define (make-seg pt1 pt2)
(cons pt1 pt2))
(define (start-point seg)
(car seg))
(define (end-point seg)
(cdr seg))
Implementazione segmento
(define (make-point x y)
(cons x y))
(define (x-coor point)
(car point))
(define (y-coor point)
(cdr point))
Implementazione punto (coordinate rettangolari)
Carlo Strapparava - Informatica
Esercizio: punti e segmenti! Cambiamo la rappresentazione dei punti e usiamo la
rappresentazione polare p=(r,!)! I programmi di alto livello (es. segment-length) non
cambiano: usano costruttori e selettori con gli stessi nomi
r
!
!
x = r cos"
y = r sin"
(define (make-point r ang)
(cons r ang))
(define (x-coor p)
(* (car p) (cos (cdr p))))
(define (y-coor p)
(* (car p) (sin (cdr p))))
3
Carlo Strapparava - Informatica
Che cosa intendiamo per “dati” ?
! I dati sono definiti da una collezione dicostruttori e selettori, insieme a specifichecondizioni che queste procedure devonosoddisfare
! Data abstraction interviene a tutti i livelli! Es. Non abbiamo mai detto cosa sia una
coppia, ma soltanto che avevamo leprocedure cons, car e cdr per operare sullecoppie
Carlo Strapparava - Informatica
Che cosa intendiamo per “dati” ?
! Riguardo le coppie, l’unica cosa che ciinteressa sapere è che
! cons, car, e cdr sono primitive nelloScheme
! Tuttavia qualunque tripla di procedure chesoddisfa le precedenti condizioni, può essereusata per implementare le coppie
(car (cons x y)) => x
(cdr (cons x y)) => y
4
Carlo Strapparava - Informatica
Che cosa intendiamo per “dati” ?
! Per esempio, possiamo implementare lecoppie, senza usare nessuna struttura dati,ma soltanto le procedure
(define (cons x y)
(lambda (pick)
(cond ((= pick 1) x)
((= pick 2) y)
(else (error "L'argomento non e' ne' 1 ne' 2”))))
)
(define (car z) (z 1))
(define (cdr z) (z 2))
Carlo Strapparava - Informatica
Che cosa intendiamo per “dati” ?(define (cons x y)
(lambda (pick)
(cond ((= pick 1) x)
((= pick 2) y)
(else (error "L'argomento non e' ne' 1 ne' 2”))))
)
(define (car z) (z 1))
(define (cdr z) (z 2))
(cons 6 9) => (lambda (pick)
(cond ((= pick 1) 6)
((= pick 2) 9)
(else (error "L'argomento non e' ne' 1 ne' 2”))))
5
Carlo Strapparava - Informatica
Cons, car, cdr in versione procedurale
! Esiste una versione ancora più elegante diimplementare le coppie “proceduralmente”
(define (cons x y)
(lambda (m) (m x y)))
(define (car z)
(z (lambda (p q) p)))
(define (cdr z)
(z (lambda (p q) q)))
Esercizio: verificare che funzionano con ilmodello di sostituzione
Carlo Strapparava - Informatica
Che cosa intendiamo per “dati” ?
! L’uso di queste procedure appena viste è quanto dipiù lontano ci sia dalla nostra intuizione di dato
! Tuttavia possiamo verificare che soddisfano lecondizioni date per cons, car e cdr
! Se usiamo queste procedure, esse sono indistinguibilida quelle che usano strutture dati “reali”
! La rappresentazione procedurale dei dati gioca unruolo fondamentale nelle techniche diprogrammazione avanzata, come l’object-oriented
! In particolare quanto visto prima, è un esempio diobject-oriented di stile message-passing
6
Carlo Strapparava - Informatica
Visualizzare le coppie
! Abbiamo visto che le coppie (pairs)costituiscono una sorta di “colla” per costruireoggetti composti complessi
! La notazione “standard” per visualizzare lecoppie - ad es. (cons 1 2) - è chiamatanotazione box-and-pointer
1
2(cons 1 2)
(car (cons 1 2))
" 1
(cdr (cons 1 2))
" 2
Carlo Strapparava - Informatica
Dati gerarchici e proprietà di chiusura
! Abbiamo visto che cons può essere usato percombinare coppie
! Le coppie costituiscono una sorta di mattoneuniversale per costruire ogni sorta di strutturedati
(cons (cons 1 2)
(cons 3 4)) 3 4
1 2
7
Carlo Strapparava - Informatica
Dati gerarchici e proprietà di chiusura
! La capacità di creare coppie i cui elementi sono altrecoppie è l’essenza dell’importanza della struttura alista
! Questa capacità si chiama proprietà di chiusura delcons
! cons può prendere coppie in input e produce coppiein output
(cons (cons 1 (cons 2 3))
4))
2 31
4
Carlo Strapparava - Informatica
Proprietà di chiusura
! La parola “chiusura” viene dall’algebraastratta
! Un insieme di elementi si dice chiuso secondouna certa operazione, se applicandol’operazione agli elementi dell’insieme, siottengono elementi che appartengono ancoraall’insieme
8
Carlo Strapparava - Informatica
Proprietà di chiusura
! La proprietà di chiusura ci permette di crearestrutture gerarchiche
! Strutture gerarchiche: strutture composte diparti che a loro volta sono composte di partiecc…
! Le procedure composte sono ancora procedure! I dati composti sono ancora dati! Vedremo alcune tecniche standard per
rappresentare sequenze (liste) e alberi, usandole coppie
Carlo Strapparava - Informatica
Rappresentare le sequenze (liste)! Una sequenza è una collezione ordinata di
oggetti
! Un modo semplice di rappresentare lesequenze in termini di coppie è usando unacatena di coppie
(cons 1
(cons 2
(cons 3
(cons 4 nil))))
1 2 3 4
9
Carlo Strapparava - Informatica
Rappresentare le sequenze (liste)
! Il car di ciascuna coppia corrisponde ad unelemento della catena
! Il cdr di una coppia è la coppia successivanella catena
! Il cdr della coppia finale segnala la fine dellacatena:" nella rappresentazione box-and-pointer è indicato
come un barra /" nei programmi con la variabile nil" nil può essere pensato come la sequanza di
nessun elemento (cioè la lista vuota)
Carlo Strapparava - Informatica
Liste! Lo Scheme fornisce una procedura primitiva list che è
il costruttore delle liste! La lista vista prima può essere costruita con(list 1 2 3 4)
! In generale(list <el1> <el2> … <eln>)
! È equivalente a(cons <el1> (cons <el2> (cons … (cons <eln> nil)…)))
! (list) ritorna la lista vuota: (define nil (list))! I sistemi Scheme stampano le liste come sequenze di
elementi
(list 1 2 3 4)
" (1 2 3 4)
10
Carlo Strapparava - Informatica
Operazioni sulle liste
! Tramite car e cdr possiamo scrivereprocedure che manipolano le liste
! Per esempio, scriviamo una proceduralist-ref che prende due argomenti:
1. una lista2. un numero n
! e ritorna l’ n-esimo elemento della lista! Il primo elemento è in posizione 0
Carlo Strapparava - Informatica
Operazioni sulle liste
(define (list-ref items n)
(if (= n 0)
(car items) ;per n=0 torna il car della lista
(list-ref (cdr items) (- n 1))))
;altrimenti torna l’ (n-1) esimo elemento del cdr della lista
(define lista-quadrati (list 1 4 9 16 25))
(list-ref lista-quadrati 3)
"16
3 2 1 0
11
Carlo Strapparava - Informatica
Operazioni sulle liste
! Spesso dobbiamo scandire la lista tramite ilcdr
! Lo Scheme fornisce una procedura primitivanull? che testa se il suo argomento è la listavuota
(null? nil)
" #t
(null? (list 1 2))
" #f
Carlo Strapparava - Informatica
Esempio: lunghezza di una lista
(define (length items)
(if (null? items)
0 ;la lunghezza della lista vuota è 0
(+ 1 (length (cdr items))))) ;altrimenti la lunghezza è 1 più la lunghezza del cdr
(define dispari (list 1 3 5 7))
(length dispari)
" 4
12
Carlo Strapparava - Informatica
Esempio: lunghezza di una lista
! Riconosciamo nella definizione di length ilclassico piano dell’induzione" la lunghezza della lista vuota è 0" la lunghezza di una lista è 1 più la lunghezza del cdr
della lista
! Possiamo anche definire length in stile iterativo
(define (length items)
(define (length-iter a count)
(if (null? a)
count
(length-iter (cdr a) (+ 1 count))))
(length-iter items 0))
Carlo Strapparava - Informatica
Esempio: append
! Un’altra tecnica comune è quello di costruirenuove liste con una successione di cons
! Es. La procedura append prende due listecome argomenti, e da queste forma unanuova lista
(append lista-quadrati dispari)
" (1 4 9 16 25 1 3 5 7)
(append dispari lista-quadrati)
" (1 3 5 7 1 4 9 16 25)
13
Carlo Strapparava - Informatica
Esempio: append
! Per implementare append usiamo ancora unpiano ricorsivo:
! Fai append di list1 list2" se list1 è la lista vuota, allora il risultato è list2" altrimenti, fai append del cdr di list1 con list2,
e fai cons del car di list1 con questo risultato
(define (append list1 list2)
(if (null? list1)
list2
(cons (car list1) (append (cdr list1) list2))))
Carlo Strapparava - Informatica
Esercizi:last-pair e reverse(define (last-pair list) ;restituisce l’ultimo pair di una lista
(if (null? (cdr list))
list
(last-pair (cdr list))))
(define (reverse items)
(if (null? items)
nil
(append (reverse (cdr items)) (list (car items)))))
(define (reverse items) ;reverse in versione iterativa
(define (rev-iter items acc)
(if (null? items)
acc
(rev-iter (cdr items) (cons (car items) acc))))
(rev-iter items nil))
top related