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>