BuK/IIm11/Studenten/sistsche/uebung3
Aus ProgrammingWiki
Wiki-Quelltext dieser Seite.
<language>Scheme</language>
Aufgabe 6 (Robert Rosenberger, Stefan Scheumann)
ÜA: Definieren Sie die Menge der geraden Zahlen (Zahlwörter) und die der ungeraden Zahlen (Zahlwörter) und veranlassen Sie das ProgrammingWiki die 30 ersten Elemente der Vereinigungsmenge (in aufsteigender Sortierung) auszugeben.
Gegeben:
$ A = {0,1,2,3,4,5,6,7,8,9} $
$ A^{*} = { \epsilon,0,1,2,...,10,11,12,...,100,101,...} $
Menge der geraden Zahlwörter $ M_{1}$ mit:
$ M_{1} \subseteq A^{*}$
$ f: \N \rightarrow M_{1} \text{ mit } f(x) = 2x $
Menge der ungeraden Zahlwörter $ M_{1}$ mit:
$ M_{2} \subseteq A^{*}$
$ g: \N \rightarrow M_{2} \text{ mit } g(x) = 1+2x $
Vereinigung:
$ M_{1} \cup M_{2} \subseteq A^{*}$
$h: \N \rightarrow M_{1} \cup M_{2}$
$$
h(i) = \begin{cases}
f(\frac{i}{2}), & \text{wenn } 2|i;\\
g(\frac{i - 1}{2}), & \text{sonst}.
\end{cases}$$
<code id="4f7830628f1bf" hidden>
(define stream-car car)
(define stream-cdr
(lambda (stm)
(force (cdr stm))))
;; Konstruktoren
(define-syntax stream-cons
(syntax-rules ()
((_ head tail) (cons head (delay tail)))))
(define stream-item
(lambda (str k)
(if (= k 0)
(stream-car str)
(stream-item (stream-cdr str) (- k 1)))))
(define print-stream
(lambda (stm n)
(cond
((<= n 0) (display "...\n"))
(else
(display (number->string(stream-car stm)))
(display ", ")
(print-stream (stream-cdr stm) (- n 1))))))
(define fib-maker
(lambda (a b)
(stream-cons a (fib-maker b (+ a b)))))
</code>
<code id="4f7830628f229">
(define make-stream-intersect
(lambda (stm1 stm2)
(letrec ((n 0)
(stm1org stm1)
(stm2org stm2)
(stream-intersect-helper
(lambda (stm1 stm2 n)
(cond
((even? n)
(if(stream-contains? (stream-car stm1) stm2org (/ n 2))
(stream-cons (stream-car stm1) (stream-intersect-helper (stream-cdr stm1) stm2 (+ n 1)))
(stream-intersect-helper (stream-cdr stm1) stm2 (+ n 1))))
(else
(if(stream-contains? (stream-car stm2) stm1org (/ (- n 1) 2) )
(stream-cons (stream-car stm2) (stream-intersect-helper stm1 (stream-cdr stm2) (+ n 1)))
(stream-intersect-helper stm1 (stream-cdr stm2) (+ n 1))))))))
(stream-intersect-helper stm1 stm2 n))))
(define stream-contains?
(lambda (item stm n)
(cond
((equal? item (stream-car stm)) #t)
((= n 0 ) #f)
(else (stream-contains? item (stream-cdr stm) (- n 1))))))
(define natstream (nat-stream-maker 0))
(define oddstream (stream-map natstream(lambda (x) (+ 1 (* 2 x)))))
(define primstream (stream-filter natstream prim?))
(define fibstream (fib-maker 0 1))
</code>
<run id="4f7830628f2a5">
(display "fibanocci Zahlen\n")
(print-stream fibstream 10)
(display "geraden Zahlen\n")
(print-stream oddtream 10)
(define intersectstream (make-stream-intersect fib-stream oddstream))
(display "Schnittmenge Fibanocci und gerade Zahlen\n")
(print-stream intersectstream 10)
</run>