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))))))
</code>
<code id="4f7830628f229">
(define nat-stream-maker
(lambda ()
(letrec ((n 0)
(nat-stream-maker-helper
(lambda (start)
(stream-cons start (nat-stream-maker-helper (+ start 1))))))
(nat-stream-maker-helper 0))))
(define stream-map
(lambda (stm proc)
(stream-cons
(proc (stream-car stm))
(stream-map (stream-cdr stm) proc))))
(define even-odd-merging-stream-maker
(lambda (oddstm evenstm)
(letrec ((n 0)
(even-odd-merging-stream-maker-helper
(lambda (n oddstm evenstm)
(if (even? n)
(stream-cons (stream-car evenstm) (even-odd-merging-stream-maker-helper (+ n 1) oddstm (stream-cdr evenstm)))
(stream-cons (stream-car oddstm) (even-odd-merging-stream-maker-helper (+ n 1) (stream-cdr oddstm) evenstm))))))
(even-odd-merging-stream-maker-helper n oddstm evenstm))))
(define natstream (nat-stream-maker ))
(define oddstream (stream-map natstream(lambda (x) (+ 1 (* 2 x)))))
(define evenstream (stream-map natstream (lambda (x)(* 2 x))))
(define mergestream (even-odd-merging-stream-maker oddstream evenstream))
</code>
<run id="4f7830628f2a5">
(display "ungerade Zahlen\n")
(print-stream oddstream 30)
(display "ungerade Zahlen\n")
(print-stream evenstream 30)
(display "Vereinigung gerade und ungerade Zahlen\n")
(print-stream mergestream 30)
</run>