Übung 10.5

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Übung 10.5
Bis auf die zweisträngige DNA von Teil d.) ist alles implementiert und funktioniert (außer Du findest doch einen Fehler…).
Gut zu wissen ist noch, dass ich für j.) 3 Hilfsfunktionen geschrieben habe, welche die Doppelstrang-DNA wieder in zwei einzelne Stränge zerlegt.
Verbesserungsvorschläge immer gerne willkommen!!
Ich liebe Quellcode :wink:

[CODE](define (complement-base base)
(cond ((eq? base 'g) 'c)
((eq? base 'c) 'g)
((eq? base 't) 'a)
((eq? base 'a) 't)
(display “ERROR”)))

(define (complement-strang strang)
(if (not (null? strang))
(cons (complement-base (car strang)) (complement-strang (cdr strang)))
'() ))

(define (make-double strang)
(if (not (null? strang))
(cons (list (car strang) (complement-base (car strang))) (make-double (cdr strang)))
'() ))

(define (count-bases strang)
(define (c-b strang a c g t)
(if (not (null? strang))
(cond ((eq? (car strang) 'a) (c-b (cdr strang) (+ a 1) c g t))
((eq? (car strang) 'c) (c-b (cdr strang) a (+ c 1) g t))
((eq? (car strang) 'g) (c-b (cdr strang) a c (+ g 1) t))
((eq? (car strang) 't) (c-b (cdr strang) a c g (+ t 1)))
(display “ERROR”))
(list (list 'a a) (list 'c c) (list 'g g) (list 't t))))
(c-b strang 0 0 0 0))

(define (split-append-double strang)
(define (help dstrang welcher)
(if (not (null? dstrang))
(if (= welcher 0)
(cons (caar dstrang) (help (cdr dstrang) welcher)) ;Warum muss in dieser Zeile “cons” und
(append (cdar dstrang) (help (cdr dstrang) welcher))) ;in dieser “append” stehen???
'() ) ;Das habe ich durch ausprobieren herausgefunden… :wink:
)
(cons (help strang 0) (help strang 1)))

(define (haupt-strang strang)
(car (split-append-double strang)))

(define (neben-strang strang)
(cdr (split-append-double strang)))

;Achtung!!! Kommen leere Listen vor, so ist dieses Pädikat immer wahr…
(define (prefix? fix strang)
(if (not (or (null? fix) (null? strang)))
(if (eq? (car fix) (car strang))
(prefix? (cdr fix) (cdr strang))
#f)
#t))

(define (appears? seq strang)
(if (not (null? strang))
(if (prefix? seq strang)
#t
(appears? seq (cdr strang)))
#f))

(define (covers? seq strang)
(define (cv? seq coveror strang)
(if (prefix? seq strang)
(if (= (length seq) (length strang))
#t
(if (> (length seq) (length strang))
#f
(cv? (append seq coveror) coveror strang)))
#f))
(cv? seq seq strang))

(define (prefix n strang)
(if (= n 0)
'()
(cons (car strang) (prefix (- n 1) (cdr strang)))))

(define (kernel strang)
(define (k strang leng)
(if (<= leng (length strang))
(if (covers? (prefix leng strang) strang)
(prefix leng strang)
(k strang (+ leng 1)))
#f))
(k strang 1))

(define (draw-dna strang)
(define (draw-sym len what)
(if (> len 0)
(begin
(display what)
(draw-sym (- len 1) what))
(newline)))
(define (draw-base len drstrang)
(if (> len 0)
(begin
(display " “)
(display (list-ref drstrang (- len 1)))
(draw-base (- len 1) drstrang))
(newline)))
(begin
(draw-sym (length strang) “----”)
(draw-sym (length strang) " !”)
(if (pair? (car strang))
(begin
(draw-base (length (haupt-strang strang)) (haupt-strang strang))
(draw-sym (length strang) " :“)
(draw-base (length (neben-strang strang)) (neben-strang strang)))
(draw-base (length strang)))
(draw-sym (length strang) " !”)
(draw-sym (length strang) “----”)))
[/CODE]


(define (split-append-double strang)
  (define (help dstrang welcher)
    (if (not (null? dstrang))
        (if (= welcher 0)
            (cons (caar dstrang) (help (cdr dstrang) welcher))       ;Warum  muss in dieser Zeile "cons" und
            (append (cdar dstrang) (help (cdr dstrang) welcher)))    ;in dieser "append" stehen???
        '() )                                                        ;Das habe ich durch ausprobieren herausgefunden... ;-)
    )
  (cons (help strang 0) (help strang 1)))

“aus dem bauch” heraus:

(cons (caar dstrang) (help (cdr dstrang) welcher)) 

das ist ja (afaik) die art wie man in scheme listen (eigentlich) aufbaut.

(append (cdar dstrang) (help (cdr dstrang)

lieferst du hier nicht eine liste zurück: (cdr (car dstrang?))
listen werden mit append verknüpft