(require (lib "trace.ss")) ;Aufgabe 1 (define (list? liste) (if (and (pair? liste) (not (null? liste))) (list? (cdr liste)) (cond ((eq? liste '()) '#t) (else '#f))) ) ;falls das mit '#t und '#f nicht gerne gesehen wird: ; (define (list? l) ; (if (and (pair? l) (not (null? l))) (list? (cdr l)) ; (cond ((eq? '() l) (and #t #t)) ; (else (and #f #f))))) ;(list? (cons 1 (cons 2 (cons 3 (cons (cons 4 5) (cons 6 (cons (cons 7 8) (cons 9 '())))))))) ;(list? (cons (cons (cons (cons 1 (cons (cons 2 3) 4)) (cons 5 '())) (cons 6 (cons 7 8))) 9)) ;(list? (cons (cons (cons (cons (cons (cons '() 1) 2) 3) 4) 5) (cons 6 (cons (cons 8 7) 9)))) ;(list?(cons (cons 1 2) (cons 3 (cons 4 (cons (cons 5 6) (cons 7 (cons (cons 8 9) '()))))))) ;(list? (cons 1 (cons (cons (cons 2 (cons 3 (cons (cons 4 5) 6))) (cons (cons 7 8) '())) 9))) ;Aufgabe 2 (define (collatz i) (if (even? i) (/ i 2) (+ (* i 3) 1)) ) ;(collatz 7);-->22 (define (collatz-length i) (define (laenge i n) (if (> i 1) (laenge (collatz i) (+ n 1)) n) ) (laenge i 1) ) ;(collatz-length 6);-->9 (define (collatz-longest n) (define (zaehlen i momlmax momimax) (cond ((<= i n) (if (< (collatz-length i) momlmax) (zaehlen (+ i 1) momlmax momimax) (zaehlen (+ i 1) (collatz-length i) i))) (else (display "Die längste Collatz-Folge ist ") (display momimax) (display " mit der Länge ") (display momlmax) (newline) (display momlmax))) ) (zaehlen 0 0 0) ) ;(collatz-longest 10000) ;Aufgabe 3 a (define (reduce f initial-value list) (if (not (null? list)) (reduce f (f (car list) initial-value) (cdr list)) initial-value)) ;(reduce + 0 '(4 2 5 7 3 -1 7)) ; --> 27 ;(reduce cons '() '(6 2 2)) ; --> (2 2 6) ; Dieser Aufruf entspricht (reverse) weil er die das erste Element der Liste an eine andere (hier: leer) ; Liste davorhängt und dies solange macht bis keine Elemente mehr vorhanden sind. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Aufgabe 3 b (define (map f list) (reduce cons '() (reduce (lambda (x y) (cons (f x) y)) '() list))) ;(map sqrt '(81 25 4 289 169)) ; --> (9 5 2 17 13) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Aufgabe 3c (define (partition threshold list) (reduce (lambda (x y) (cond ((>= x threshold) (cons (car y) (cons x (cdr y)))) (else (cons (cons x (car y)) (cdr y))))) (cons '() '()) list)) ; Alles eine Frage des Aufrufs :D ;(partition 3 '(0 3 5 7 2 1 6 4)) ; --> ((1 2 0) 4 6 7 5 3)