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