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.
Klausur 09/01: Aufgabe 3a
Hi,
bei der Aufgabe 3a ist eine Funktion verlangt, die unter anderem folgendes bewerkstelligt:
(cut '1 '(1 2 3))
(2 3)
(cut '(1) '(1 2 3))
(2 3)
Nun ist die Frage, ob
(cut '1 '((1) 2 3))
das: ((1) 2 3)
oder das: (2 3) ergeben soll.
Ich hab das jetzt mal fuer Variante 1 implementiert (ist nicht schoen, aber geht):
(define (cut sublyst lyst)
(if (null? lyst)
'()
(if (equal? sublyst (car lyst))
(cut sublyst (cdr lyst))
(if (and (list? sublyst) (= (length sublyst) 1))
(if (equal? (car sublyst) (car lyst))
(cut sublyst (cdr lyst))
(cons (car lyst) (cut sublyst (cdr lyst))))
(cons (car lyst) (cut sublyst (cdr lyst)))))))
Was meint ihr, was man da machen soll? Logischer waere Variante 2, aber das ist nervig zu coden
Danke,
Swarsron
also,
erstmal: diese aufgabe ist eine totale scheissaufgabe, weil
- kann man die nur auf dem blatt ohne zu testen meiner meinung nach kaum hinbekommen und
- ist total unklar, was die machen soll! wenn es hiesse, sie soll einen teilbaum oder ein element rausschneiden, alles klar, aber was bitte soll dann das zweite angegebene beispiel? da soll dann ploetzlich auch das in dem angegebenen teilbaum enthaltene element entfernt werden. warum entfernt er dann beim dritten beispiel nicht auch noch die freistehende eins? also irgendwie ist das schon seehr komisch.
hier meine loesung fuer die aufgabe, die beim zweiten fall halt nur den teilbaum rausschneidet, nicht aber nochmal die eins:
(define (cut subtree lyst)
(cond ((or (null? subtree) (null? lyst)) '())
((equal? (car lyst) subtree) (cut subtree (cdr lyst)))
((pair? (car lyst)) (cons (cut subtree (car lyst))
(cut subtree (cdr lyst))))
(else (cons (car lyst) (cut subtree (cdr lyst))))))
(cut 1 '(1 2 3))
(cut '(1) '((1) 2 1))
(cut '(1 2) '(1 (1 2) 3))
(cut '() '())
hth, -steppenwolf