Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
;; FUNZIONI RICORSIVE SUI NUMERI NATURALI
;; Struttura del corpo di una f.ne ricorsiva
;; di tipo tail recursion
;; costrutto cond
;; -clausola caso base
;; -clausola caso induttivo (richiamo della
;; f.ne stessa)
;; nota: entrambe le clausole possono
;; essere piu' di una
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Esercizio: implementare la funzione
;; fattoriale
;; 1)definizione informale dell'operazione
;; 2)parametri formali ?
;; 3)implementazione (ricordare la struttura
;; della funzione descritta sopra!)
;; 4)test
;; Definizione? caso base? passo induttivo?
;; fattoriale: number -> number
(define (fattoriale n)
(cond
;; caso base
[(= n 0) 1]
;; passo induttivo
[else (* n (fattoriale (- n 1)))]))
;; Domanda: cosa accade se fattoriale
;; non descrive il caso base?
;; risultato incorretto ?
;; la funzione termina ?
;;;;;;;;;;;;;;;
;; Esercizio: implementare la funzione
;; di Fibonacci definita come segue:
;; Fb(n) = 1 se n=0 oppure se n=1
;; Fb(n) = Fb(n-1) + Fb(n-2)
;; 3)implementazione (ricordare la struttura
;; della funzione descritta sopra!)
;; 4)test
;; Fb: number -> number
(define (Fb n)
(cond
;; caso base
[(or (= n 0) (= n 1)) 1]
;; passo induttivo
[else (+ (Fb (- n 1)) (Fb (- n 2)))]))
;;;;;;;;;;;;;;;
;; Esercizio: implementare la somma fra
;; 2 numeri, supponendo di disporre delle
;; sole operazioni di incremento e
;; decremento di una unita'
;; 1)definizione informale dell'operazione
;; 2)parametri formali ?
;; 3)implementazione (ricordare la struttura
;; della funzione descritta sopra!)
;; 4)test
;; somma: number number -> number
(define (somma a b)
( cond
([= b 0] a)
(else (+ 1 (somma a (- b 1))))))
;;;;;;;;;;;;;;;
;; Esercizio: implementare il prodotto fra
;; 2 numeri supponendo di disporre della
;; sola operazione di somma (usare la f.ne
;; somma appena definita)
;; 1)definizione informale dell'operazione
;; 2)parametri formali ?
;; 3)implementazione
;; 4)test
;; prodotto: number number -> number
(define (prodotto a b)
(cond
[(= b 0) 0]
[(= b 1) a]
;;esempio di 2 clausole per il caso base
[else (somma a (prodotto a (- b 1)))]))
;;;;;;;;;;;;;;;
;; Esercizio: implementare la funzione
;; fattoriale supponendo di disporre della
;; sola operazione di prodotto definita sopra
;; fatt: number -> number
(define (fatt n)
(cond
;; caso base
[(= n 0) 1]
;; passo induttivo
[else
(prodotto n (fatt (- n 1)))]))
;; NOTA: fatt utilizza solo le operazioni
;; aritmetiche di incremento e
;; decremento di una unita'.
;; La complessita' computazionale di fatt
;; e' sensibilmente piu' elevata di fattoriale.
;; Confrontare il tempo di calcolo necessario
;; per fatt e fattoriale
;;;;;;;;;;;;;;;
;; Esercizio: implementare somma_n
;; somma_n, dato in input un naturale
;; restituisce la somma dei primi n numeri
;; naturali
;; 1)definizione informale dell'operazione
;; Prima soluzione, non ricorsiva
;; la somma dei primi n numeri naturali e'
;; pari a n * (n+1) / 2
;; somma_n: number -> number
(define (somma_n n) (/ (* (+ n 1) n) 2))
;; 1)definizione informale dell'operazione
;; Soluzione ricorsiva
;; somma_nr(n) = ???
;; somma_nr: number -> number
(define (somma_nr n)
( cond
([= n 0] 0)
(else (+ n (somma_n (- n 1))))))
;; suggerimento: verificare il
;; funzionamento di somma_nr con step
;(somma_nr 4)
;;;;;;;;;;;;;;; Esercizio dato a Lezione
;; Esercizio: implementare una funzione
;; che calcoli b elevato alla n
;; 1)definizione informale dell'operazione
;; 2)parametri formali ?
;; 3)implementazione
;; 4)test
;; 1) come definire b elevato alla n ?
;; esponente: number number -> number
(define (esponente b n)
( cond
([= n 0] 1)
(else (* b (esponente b (- n 1))))))
;; costruire gli step x (esponente 4 2)
;(esponente 4 2)
;;;;;;;;;;;;;;;
;; Esercizio: implementare esponente
;; utilizzando solo l'operazione di
;; incremento e decremento di una unita'
;; Test in classe
;;;;;;;;;;;;;;;
;; Esercizio: implementare la funzione
;; pari? che determini se e' vero che
;; il numero in ingresso n e' pari o no
;; rispondendo con un valore booleano
;; 1)definizione informale dell'operazione
;; 2)parametri formali ?
;; 3)implementazione
;; 4)test
;; 1) come formalizzare la proprieta' di
;; essere numeri pari?
;; pari?: number -> boolean
;(define (pari? n)
; (or (= n 0)
; (cond
; ([>= n 2] (pari? (- n 2)))
; (else false))))
;; NOTA: osservare gli operatori di
;; or nell'espressione
;; Domanda: come implementereste la
;; funzione dispari?
(define (dispari? n)
(or (= n 1)
(cond
([>= n 3] (dispari? (- n 2)))
(else false))))
;;;;;;;;;;;;;;;
;; Funzione pari: Soluzione alternativa
;; un numero e' pari se e' 0 oppure
;; se n-1>0 e n-1 e' dispari, n e'
;; dispari se n=1 oppure se n-1 e' pari
;; esempio di mutua ricorsione
(define (pari2nd? n)
(cond
[(= n 0) true]
[else (dispari2nd? (- n 1))]))
(define (dispari2nd? n)
(cond
[(= n 0) false]
[(= n 1) true]
[else (pari2nd? (- n 1))]))
;; Notare la mutua ricorsione e le
;; condizioni di terminazione
;; nella funzione dispari2nd?,
;; altrimenti dispari2nd? 0, pari? 1
;; non terminerebbero
;;;;;;;;;;;;; Lezione del 24/10/01
;;;;;;;;;;;;;;;
;; Esercizio: implementare la f.ne
;; pari con la definizione:
;; 0 e' pari
;; n e' pari se n-1 non lo e'
(define (pari? n)
(cond
[(= n 0) true]
[else (not (pari? (- n 1)))]))
;;;;;;;;;;;;;;;
;; Esercizio
;; Implementare la funzione esponente
;; ottimizzata:
;; b^n = (b^(n/2))^2 se n pari
;; b^n = b * b^(n-1) se n dispari
;; Attenzione: come scrivere (b^(n/2))^2?
;; come prodotto (b^(n/2)*b^(n/2) )?
;; come quadrato (square b(n/2)) ?
;; analizzare quale scelta ottimizza la
;; computazione
(define (esponente2 b n)
(cond
[(= n 0) 1]
[(
pari? n) (square
(esponente2 b (/ n 2)))]
[else (* b (esponente2 (- n 1)))]))
;;;;;;;;;;;;;;;
;; Esercizio: determinare se un numero e'
;; un multiplo dell'altro
;; multiplo?: number number -> boolean
(define (multiplo? a b)
(cond
[(= a b) true]
[(> b a) false]
[else (multiplo? (- a b) b)]))
;; Soluzine alternativa
(define (multiplo2? a b)
(mult? a b b))
(define (mult? a sp b)
(cond
[(= a sp) true]
[(> sp a) false]
[else (mult? a (+ sp b) b)]))
;(multiplo2? 6 2)
;;;;;;;;;;;;;;;
;; Esercizio: determinare il resto della
;; divisione intera fra due naturali
;; resto: number number -> number
;;;;;;;;;;;;;;;
;; Esercizio
;; Implementare l'espressione di >=
;; supponendo di avere solo inc
;; e dec unitario
;; definizione della relazione >=?
(define (maggioreouguale? a b)
(cond
[(= a b) true]
[(= a 0) false]
[else (maggioreouguale? (- a 1) b)]))
;;;;;;;;;;;;;;;
;; Esercizio:
;; Implementare una funzione che esegue il
;; confronto di > fra 2 numeri supponendo di
;; avere solo inc e dec unitario
;; e l'operatore di uguaglianza
;; esempio: (maggiore? 3 7) -> false
;; esempio: (maggiore? 7 3) -> true
;; esempio: (maggiore? 7 7) -> false
;; Domanda: come definire la relazione?
;; Soluzione
;; (maggiore? 0 b) -> false, per ogni b
;; (maggiore? a b) -> true se esiste un
;; numero a' t.c. vale 0<=a'< a, a'=b,
;; false altrimenti
(define (maggiore? a b)
(cond
[(= a 0) false]
[else (maggioreouguale? (- a 1) b)]))
;; funzione che testa la seconda
;; clausola formalizzata sopra
;; soluzione alternativa:
;; evito il caso che siano uguali
;; confrontando (a-1) invece che a con b
(define (magg? a b)
(cond
[(= a 0) false]
[(= (- a 1) b) true]
[else (magg? (- a 1) b)]))
;; ordine delle clausole: la seconda
;; clausola non puo' essere invertita
;; con la prima provare (maggiore? 1 0)
;; con le clausole invertite
;;;;;;;;;;;;;;;
;; Esercizio: implementare la funzione
;; MCD (Massimo Comune Divisore)
;; definizione della relazione?
;; Algoritmo di Euclide
;; MCD(a,b)=a, se a=b
;; MCD(a,b)= MCD(a-b,b) se a>b
;; MCD(a,b)= MCD(a,b-a) se a a b) (MCD (- a b) b)]
[else (MCD b (- b a))]))
;;;;;;;;;;;;;;;
;; Esercizio: implementare la funzione
;; mcm (minimo comune multiplo)
;; mcm (a b) = (a*b)/MCD(a,b)
(define (mcm a b)
(/ (* a b) (MCD a b)))
;;;;;;;;;;;;;;;
;; Esercizio: determinare se, dato
;; un numero n, questo e' primo
;; primo?: number -> boolean
;; prim? number number -> boolean
(define (prim? n1 n2)
(cond
([or (= n2 1) (= n1 1)] true)
(else (and
(not (= (remainder n1 n2) 0))
(prim? n1 (- n2 1))))))
;; primo? number -> boolean
(define (primo? n)
( prim? n (- n 1)))