======C7R.scm====== <code shell>#!/usr/bin/env racket #lang racket/base</code> zadání (slepá mapa) viz [[C7.scm]], 2014-jan-17 (honz4) ======1. abs-min====== V [[PAPR1:L7#s7_3|sekci 7.3]] jsme rozšířili proceduru min2 na proceduru libovolného počtu argumentů. Stejným způsobem rozšiřte proceduru na výběr čísla s extrémní absolutní hodnotou abs-min. <hidden potrebujeme abs-min a menší-rovno s +infty> <code scheme> (define +oo '+oo) </code> y=oo || (x!=oo && x <= y) ;Ceckovy zapis <= s nekonecnem <code scheme> (define <=oo (lambda (x y) (or (equal? y +oo) (and (not (equal? x +oo)) (<= x y))))) (map <=oo '(1 2 3 1 +oo +oo) '(2 1 3 +oo 1 +oo)) ;zabudujeme +oo i do abs? (define (abs+oo x) (if (equal? x +oo) x (abs x))) (define abs-min2 ;abs zabudovano v <=oo ??? (lambda (x y) (if (<=oo (abs+oo x) (abs+oo y)) x y))) ;vracime 'originalni' x y (define abs-min2__ (lambda (x y) (if (<=oo x y) x y))) (abs-min2 -10 8) ;=> 8 (define abs-min (lambda numbers (foldr abs-min2 +oo numbers))) (abs-min -10 -8 2 5 6) ;=> 2 </code> </hidden> ======2. nondecreasing====== Napište predikát, který pro posloupnost zjistí, zda je neklesající. Posloupnost bude reprezentovaná seznamem, jehož prvky jsou čísla. Viz příklady aplikace: <code scheme> (nondecreasing? '()) ;⇒ #t (nondecreasing? '(1 2 3 4)) ;⇒ #t (nondecreasing? '(1 2 4 3)) ;⇒ #f (nondecreasing? '(1 4 2 3)) ;⇒ #f (nondecreasing? '(4 1 2 3)) ;⇒ #f</code> <hidden predikát, který pro posloupnost zjistí, zda je neklesající> <code scheme> (define nondecr1 (lambda (l) (car (foldl (lambda (e t) (cons (and (car t) (>= e (cdr t))) e)) '(#t . -999999) ;lepe: >= s -infinity? l)))) (nondecr1 '(1 2 3 4)) (nondecr1 '(1 2 4 3)) (nondecr1 '(1 2 4 3 5)) (nondecr1 '(1 2 4 4 5)) </code> TODO: reimplementovat: terminator staruje #f, pak si pamatuje predchozi, nebo nastavi #t </hidden> ======3. after, before====== Napište procedury after a before, jejichž argumenty budou element elem a seznam l . Procedura after bude vracet seznam prvku za posledním výskytem prvku elem (včetně) v seznamu l. Procedura before zase seznam prvků před prvním výskytem prvku elem (včetně) v seznamu l. Viz příklady použití: <code scheme> (after 10 '(1 2 3 4 3 5 6)) ;⇒ () (after 3 '(1 2 3 4 3 5 6)) ;⇒ (3 5 6) (after 6 '(1 2 3 4 3 5 6)) ;⇒ (6) (before 10 '(1 2 3 4 3 5 6)) ;⇒ (1 2 3 4 5 6) (before 1 '(1 2 3 4 3 5 6)) ;⇒ (1) (before 3 '(1 2 3 4 3 5 6)) ;⇒ (1 2 3)</code> <hidden procedury after, before> <code scheme> (define (after x l) ;za poslednim => po prvni od konce vcetne (let ((result (foldr (lambda (e t) ;(display t) (newline) (if (car t) t ;uz nasli, vracime porad to stejne (cons (equal? e x) (cons e (cdr t))))) '(#f . ()) l))) (if (car result) (cdr result) '()))) (after 10 '(1 2 3 10 14 15)) (define (before x l) (let ((result (foldl (lambda (e t) ;(display t) (newline) (if (car t) t ;uz nasli, vracime porad to stejne (cons (equal? e x) (cons e (cdr t))))) '(#f . ()) l))) (if (car result) (reverse (cdr result)) '()))) (before 10 '(1 2 3 10 14 15)) </code> </hidden>