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.
Gerade Zahlwörter:
$ f: \N \rightarrow M_{1} \text{ mit } f(x) = 2x $
Ungerade Zahlwörter:
$ g: \N \rightarrow M_{2} \text{ mit } g(x) = 1+2x $
Vereinigung
$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>