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>