Funkcionálne programovanie cvičenie 5

Created: 2009-10-22 - 17:21

;obrateny zoznam podla parity inym sposobom
(define (odd-even x)
  (define (r x o e)
    (if (null? x)
        (list o e)
        (r (cdr x) e (cons (car x) o))))
  (r (reverse x) () ()))

;zase inym sposobom
(define (odd-even2 x)
  (if (null? x)
      (list ()())
      (list (cons (car x)
              (cadr (odd-even2 (cdr x))))
        (car (odd-even (cdr x))))))

;teraz rozdelit zoznam na parnu a neparnu polovicu - len pre zoznamy parnej dlzky
(define (halve x)
  (define (hv x y z)
    (if (null? y)
        (list (reverse z) x)
        (hv (cdr x) (cddr y) (cons (car x) z))))
  (hv x x ()))

;to iste ale aj pre zoznamy s neparnou dlzkou
(define (halve2 x)
  (define (hv x y z)
  (if (null? y)
    (list (reverse z) x)
    (if (null? (cdr y))
        (list (reverse z) x)
        (hv (cdr x) (cddr y) (cons (car x) z)))))
  (hv x x ()))

;obraz funkcie ... volame ako napr. (obraz sin '(1 2 3 4 5 6 7 8 9 0))
;to iste robi funkcia map
(define (obraz f x)
  (if (null? x)
      ()
      (cons (f (car x))
            (obraz f (cdr x)))))

;vytvorenie zoznamu z rekurzivneho zoznamu...
;teda z (1 2 (3 4 (5 6))) spravit (1 2 3 4 5 6)
(define (zatras x)
  (if (null? x)
      ()
      (if (pair? x)
          (append (zatras (car x))
                  (zatras (cdr x)))
          (list x))))

;tentokrat spravit reverse rekurzivneho zoznamu... teda z pred. prikladu na (((6 5) 4 3) 2 1)
(define (deep-reverse x)
  (if (pair? x)
      (append (deep-reverse (cdr x))
              (list (deep-reverse (car x))))
      x))

;vbudovane funkcie:
;(member 5 '(1 2 3 4 5 6 7 8 9 0))
;vrati (5 6 7 8 9 0)
;snazime sa nadefinovat member vlastnym sposobom
(define (member2 a x)
  (if (null? x)
      #f
      (if (equal? a (car x))
          x
          (member2 a (cdr x)))))
;equal? - porovnava rovnost vysledkov
;eq? - porovnava, ci je to umiestnene na rovnakom mieste v pamäti
;eqv? je o tom istom ako eq?

;definovanie prefix, suffix, infix ... teda ci je podzoznam prefixom zoznamu a pod...
(define (prefix? x y)
  (if (null? x)
      #t
      (if (equal? (car x) (car y))
          (prefix? (cdr x) (cdr y))
          #f)))

(define (suffix? x y)
  (prefix? (reverse x) (reverse y)))

(define (infix? x y)
  (or (prefix? x y)
      (if () (infix? x (cdr y))))

;infix na domacu