Funkcionálne programovanie cvičenie 6

Created: 2009-11-04 - 20:46

;dany je s-vyraz, definujte proceduru (replace x a b), kde a je atom a b je s-vyraz

(define (replace x a b)
  (if (null? x)
      '()
      (if (pair? x)
          (cons (replace (car x) a b)
                (replace (cdr x) a b))
          (if (equal? x a)
              b
              x))))

;dany je s-vyraz x, unarny predikat p?. Zistite kolko atomov v x splna p?
      
;toto nejde
(define (kolkoSplna p? x)
  (cond ((pair? x) (+ (kolkoSplna p? (car x))
                      (kolkoSplna p? (cdr x))))
        ((p? x) 1)
        (else 0)))

;p?, x, definujte predikat, ktory zisti, ci vsetky atomy v x splnaju p?
(define (iba p? x)
  (cond ((null? x))
        ((pair? x) (and (iba p? (car x))
                        (iba p? (cdr x))))
        (else (p? x))))

;Dany je symbolicky vyraz. Treba zistit maximalnu hodnotu ciselneho atomu

(define (maximum x)
  (cond ((pair? x) (let ((a (maximum (car x)))
                         (b (maximum (cdr x))))
                     (cond ((and (number? a)
                                (number? b)) (max a b))
                           ((number? a) a)
                           (else b))))
        ((number? x) x)
        (else "nie je cislo")))

;definujte filter pre zoznamy (nerekurzivne)
;(filter number? '(1 a b 2 3)) => (1 2 3)

(define (filter p? x)
  (cond ((and (pair? x) (p? (car x))) (cons (car x) (filter p? (cdr x))))
        ((pair? x) (filter p? (cdr x)))
        (else ())))

;zoznam zistit kolko prvkov v nom je navzajom roznych ////// ZA DOMACU (palenku)
;vylucenie viacnasobnych vyskytov
;vytvorenie zoznamu prvkov a ich nasobnosti - asociovany zoznam
;riesenia len orientacne...

(define (extract x)
  (cond ((null? x) ())
        ((member? (car x) (cdr x)) (extract (cdr x)))
        (else (cons (car x) (extract (cdr x))))))

(define (extract x)
  (define (e x y)
    (cond ((null? x) y)
          ((member? (car x) y) (e (cdr x) y))
          (else e (cdr x) (cons (car x) y))))
  (e x ()))