Funkcionálne programovanie cvičenie 2
Created: 2009-09-30 - 11:20
; ---------------------------- LAMBDA VYRAZY -----------------------------------
((lambda (x) (* x x)) 5)
; vyhodnocuje sa rovnako ako ked zavolame (square 5) z minuleho cvika
;
; pri vyhodnocovani lambda vyrazu sa nevyhodnocuje telo, len sa urci co to je
; vyhodnocuje sa az ked su zadane aj parametre
;
; chceme cez lambda vyraz zapisat vyrazy
; f(x,y,z) = x^2 + y^2 + (x+y)*z
(define square (lambda (x) (* x x)))
((lambda (x y z) (+ (square x)
(square y)
(* (+ x y) z)))
3 2 1) ; bez tohto by vratilo ako vysledok #<procedure>
; f(x,y) = x^2 - y^2, ak x^2 + y^2 <= 1
; = x*y, ak x^2 + y^2
(define f2 (lambda (x y)
(if (<= (+ (square x) (square y))
1)
(- (square x) (square y))
(* x y))))
(f2 3 4)
;lambda vyraz je v podstate synonymum pre proceduru
;
;----------------------- jendoducha aritmetika --------------------------------
;
;definujme cislo pi ako inverznu funkciu napr. ku sin ... sin 30 = 1/2
(define pi (* 6 (asin (/ 1 2))))
;definujme diskriminant kvadratickej rovnice
(define (diskriminant a b c)
(-(* b b) (* a c 4)))
;definujme obvod kruhu ako funkciu polomeru
(define (obvod r)
(* 2 pi r))
;definujme predikat o delitelnosti (cislo deli daco)
(define (deli? a b)(zero? (remainder b a)))
;newtonova veta o dotycnici, vypocitame odmocninu z a
;pre porovnannie je mozne zavolat built-in funkciu (sqrt a)
(define (sqrt-i a)
(define (s a odhad)
(if (dobry? a odhad)
odhad
(s a (uprav a odhad))))
(s a 1))
(define (dobry? a odhad)
(< (abs (- a (* odhad odhad)))
0.001))
(define (uprav a odhad)
(priemer odhad (/ a odhad)))
(define (priemer a b)
(/ (+ a b) 2))
;--------------------------- rekurzia --------------------
;rekurzia? podme na to zlahka... faktorial:
(define (faktorial n)
(if (= n 1)
1
(* (faktorial (- n 1)) n)))
;fibonacci
(define (fibonacci n)
(if (< n 2)
n
(+ (fibonacci (- n 1))
(fibonacci (- n 2)))))
;lepsie je na to ist iterativne... predchadzajuce riesenie je je prilis efektivne, lebo sa prilis vetvi...
(define (f n a b)
(if (= n 0)
a
(f (- n 1) b (+ a b))))
(define (fibonacci2 n) (f n 0 1))
; ----------------------- zoznamy -------------------------
(list (+ 1 2) (* 3 4))
; vyhodnoti sa a potom sa hodi do zoznamu
'((+ 1 2) (* 3 4))
; nevyhodnoti sa (kvoli apostrofu)
;---------------------- domaca uloha ----------------------
;dana je rovnica ax^2 + bx + c = 0
; definujte funkciu, ktora vypocita zoznam vsetkych rieseni v zavislosti na a, b, c