(define (factorial x) (if (< x 2) 1 (* x (factorial (- x 1))))) (define (fact_tail a x) (if (< x 2) a (fact_tail (* a x)(- x 1)))) (define (rev x) (letrec ( ; letrec = let kde definice vidi samy sebe navzajem (rev2 (lambda (a x) (if(null? x ) a (rev2 (cons(car x) a ) (cdr x))))) ) (rev2 '() x))) (define (mymap f l) (if (null? l) '() (cons (f (car l)) (mymap f (cdr l))))) (define (myzip . x) (if (null? (car x)) '() (cons (mymap car x) (apply myzip (mymap cdr x))) ) ) (define (qs cmp l) (if (null? l) l (let* ( ; let* = "let" kde dalsi definice vidi ty predchozi (pivot (car l)) (less (filter (lambda (x) (cmp x pivot)) (cdr l))) (notless (filter (lambda (x) (not (cmp x pivot))) (cdr l))) ) (append (qs cmp less) (list pivot) (qs cmp notless)) ) ) ) (define (println . l) (for-each display l) (newline)) (println "qsort<: " (qs < '(5 2 9 4 1 5 3))) (println "qsort>: " (qs > '(5 2 9 4 1 5 3))) (define (foldl2 f z l) (if (null? l) z (foldl2 f (f (car l) z) (cdr l)))) ;puvodni verze s nestandartnim chovanim (vola (f a x) misto (f x a) ) ;(define (foldl2 f z l) (if (null? l) z (foldl2 f (f z (car l)) (cdr l)))) ;na cviceni me jeste zmatlo to, ze definovana jako foldl navic volala puvodni ;foldl, proto to vypadalo ze jeden pripad se chova jinak. (define (mymax l) (foldl2 (lambda (x y) (if (> x y) x y)) 0 l)) (println "mymax: " (mymax '(5 2 9 4 1 5 3))) (define (rev3 x) (foldl2 cons '() x)) (println "rev3: " (rev3 '(5 2 9 4 1 5 3)))