1 Carlo Strapparava - Informatica Riepilogo: la radice quadrata Il programma sqrt mostra come il semplice linguaggio introdotto sia sufficiente per scrivere piccoli programmi sqrt-iter mostra come l’iterazione possa essere realizzata con la sola chiamata procedurale senza particolari costrutti iterativi (define (sqrt-iter guess x) (if (good-enough? guess x) guess (sqrt-iter (improve guess x) x))) (define (improve guess x) (average guess (/ x guess))) (define (average x y) (/ (+ x y) 2)) (define (good-enough? guess x) (< (abs (- (square guess) x)) 0.001)) (sqrt 9) => 3.00009155413138 (sqrt (+ 100 37)) => 11.704699917758145 (sqrt (+ (sqrt 2) (sqrt 3))) => 1.7739279023207892 (square (sqrt 1000)) => 1000.000369924366 (define (sqrt x) (sqrt-iter 1.0 x)) Carlo Strapparava - Informatica Riepilogo: regola generale di valutazione L’interprete prima valuta l’ operatore e gli operandi, poi applica la procedura risultante agli argomenti risultanti (applicative order). Lo Scheme implementa l’applicative order Eccezioni alla regole generale di valutazione si dicono Forme Speciali (Syntactic Sugar)
12
Embed
Riepilogo: la radice quadrata - carlostrapparava.com fileIl problema di calcolare la radice quadrata si decompone in un certo numero di sottoproblemi come fare a dire che una proposta
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
1
Carlo Strapparava - Informatica
Riepilogo: la radice quadrata
Il programma sqrt mostra come il semplice linguaggio introdottosia sufficiente per scrivere piccoli programmi
sqrt-iter mostra come l’iterazione possa essere realizzata conla sola chiamata procedurale senza particolari costrutti iterativi
Lexical scoping: le variabili libere in unaprocedura si riferiscono a bindings (= legami)fatti nelle definizioni delle procedure che leincludono
6
Carlo Strapparava - Informatica
Riepilogo
Finora abbiamo considerato alcuni elementi dellaprogrammazione Operazioni aritmetiche primitive Espressioni composte con queste operazioni Astrazioni di queste espressioni composte tramite la
definizione di procedure
Carlo Strapparava - Informatica
Procedure e processi che esse generano
Sapere le regole degli scacchi non implica ilsapere giocare a scacchi
Occorre avere: Conoscenza di quali mosse vale la pena di fare
(=> quali procedure vale la pena definire) Esperienza per prevedere le conseguenze di una mossa
(=> quali sono le conseguenze dell’esecuzione di unaprocedura)
7
Carlo Strapparava - Informatica
Procedure e processi che esse generano
Dobbiamo essere in grado di visualizzare iprocessi generati da un programma e
Capire quante risorse computazionali (tempoe spazio) consumano i vari tipi di processi
Ci sono alcune “pattern” di processo chebisogna conoscere
Carlo Strapparava - Informatica
Ricorsione lineare e Iterazione lineare
Consideriamo la funzione fattoriale
n! = n ! (n "1) ! (n " 2) ! … ! 3 ! 2 ! 1
0!= 1n!= n ! (n "1)!# $ %
Definizione per ricorrenza (usa il principio di induzione come linea guida)
8
Carlo Strapparava - Informatica
Fattoriale di N
Un modo per calcolare il fattoriale è quello diutilizzare la definizione per ricorrenza
(define (factorial n) (if (= n 0) 1 (* n (factorial (- n 1)))))
Carlo Strapparava - Informatica
Fattoriale di N (cont.)(define (fact n) (if (= n 0) 1 (* n (fact (- n 1)))))
Possiamo usare il modello di sostituzione e vedere questa procedura in azioneProviamo a calcolare 5!
Processo ricorsivo: processo caratterizzato dauna catena di operazioni differite
Procedura ricorsiva: una procedura che“sintatticamente” si riferisce a se stessa
Carlo Strapparava - Informatica
Linguaggi di prg. e Tail-Recursion
Purtroppo nella maggior parte dei ling. di prg. (inclusiAda, C, Pascal) tutte le procedure sintatticamentericorsive generano processi ricorsivi, anche se ilprocesso generato è in principio iterativo.
Come conseguenza questi linguaggi devono ricorrerea speciali costrutti iterativi (do, repeat, for, while, …)
Lo Scheme non ha questo difetto: ha la proprietà ditail-recursion
Un linguaggio tail-recursive non ha bisogno di syntactic-sugar per l’iterazione=>
12
Carlo Strapparava - Informatica
Esercizio: ricorsivo o iterativo ?
Per ognuna delle seguenti procedure dire che tipodi processo genera (i.e. ricorsivo o iterativo)
(define (my+ a b) (if (= a 0) b (inc (my+ (dec a) b))))
(define (my+ a b) (if (= a 0) b (my+ (dec a) (inc b))))
Sono supposte già definite le funzioni inc e dec che rispettivamenteincrementano e decrementano il loro argomento di 1