Funkcionálne programovanie cvičenie 2

Created: 2009-09-30 - 11:20

scheme

; ---------------------------- 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