FB18 - Das Forum für Informatik

fb18.de / Diplom Informatik / Unterbereich Grundstudium / Praktische Informatik

Aufgabe

Aufgabe 2002-02-18 13:17
Anonymer User
'((1 2) ( 2 3 ) (1 2) (5 2) (2 3))

evaluiert zu ((1 2) (2 3) (5 2))

Kann mir jemand ne Funktion definieren, die das berechnet(also identische Elemente einer Liste loescht!)??

Re: Aufgabe 2002-02-18 13:30
Anonymer User
hab versucht
geht gar nicht

Re: Aufgabe 2002-02-18 13:49
Popcorn
Irgendwie muss das doch gehen?! Ich bin erst mal damit angefangen, dass wenn zwei direkt nebeneinander stehende Paare gleich sind, die ausgemerzt werden sollen. Aber nicht mal das bekomme ich hin. :L

(define (gleichkill liste)
(cond
((null? liste) '())
((equal? car cadr) (cons (cdr liste) (gleichkill (cdr liste))))
(else
(cons (car liste) (gleichkill (cdr liste))))))

Und er springt einfach nicht auf das equal? an, obwohl

(equal? (car '((1 2) (1 2) (1 2) (5 2) (2 3))) (cadr '((1 2) (1 2) (1 2) (5 2) (2 3)))) => #t

Böldes Ding… *gna*


Re: Aufgabe 2002-02-18 14:11
Zaphod
Nichts leichter als das:

(define (gleichkill liste) (cond ((null? liste) '()) ((member (car liste) (cdr liste))(gleichkill (cdr liste))) (else (cons (car liste) (gleichkill (cdr liste))))))
Das ist doch wirklich nicht so schwer, oder?

Re: Aufgabe 2002-02-18 15:07
Popcorn
Wieso geht es mit Equal? nicht, wenn er da auch #t ausgibt?

Re: Aufgabe 2002-02-18 15:37
Zaphod
Dein Programm enthält mehrere Fehler:

1. SYNTAX beachten!!
–>4. Zeile: (equal? car cadr)
muss heißen: (equal? (car liste) (cadr liste)) ;sonst werden car und cadr für nichtdefinierte Variablen gehalten

2. Programmverlauf beachten:
du überprüfst nur, ob die liste leer ist, nicht aber, ob die restliste leer ist, sodass beim letzten Element immer der Fehler auftaucht, dass auf das erste Element der leeren Liste zugegriffen wird, sodass ein Fehler entsteht.

3.: (cons (cdr liste) (gleichkill (cdr liste))); HÄÄÄ? das verstehe ich nicht. Beachte: Die liste wird beim Nachklappern aus der leeren liste aufgebaut; und ggf. soll noch ein ELEMENT davorgehängt werden. Aber doch nicht (cdr liste) !!!

Richtiges Programm:
(define (gleichkill liste) (cond ((null? liste) '()) ((null? (cdr liste))(list (car liste)) ) ((equal? (car liste) (cadr liste)) (gleichkill (cdr liste))) (else (cons (car liste) (gleichkill (cdr liste))))))


Re: Aufgabe 2002-02-18 17:01
Anonymer User
Richtiges Programm:
(define (gleichkill liste) (cond ((null? liste) '()) ((null? (cdr liste))(list (car liste)) ) ((equal? (car liste) (cadr liste)) (gleichkill (cdr liste))) (else (cons (car liste) (gleichkill (cdr liste))))))

Diese Programm würde diese Liste `((1 2) (2 3) (1 2))
allerdings auswerten zu ((1 2) (2 3) (1 2)) und nicht das zweite (1 2) entfernen
(wegen: "equal? (car list) (cadr list)" ).

Re: Aufgabe 2002-02-18 17:16
Popcorn
Ja als ich vorhin etwas anderes gemacht habe, ist mir auch überhaupt erst aufgefallen, was Du eigentlich meintest Zaphod. Vergiss meine Frage wieder. Und das mit dem 'liste bei car… vergessen. Oh weia. Wie sagt Grinchi doch gleich? Ich hab echt gelitten…

Re: Aufgabe 2002-02-18 17:18
Popcorn
Diese Programm würde diese Liste `((1 2) (2 3) (1 2))
allerdings auswerten zu ((1 2) (2 3) (1 2)) und nicht das zweite (1 2) entfernen
(wegen: "equal? (car list) (cadr list)" ).

Ja, ich wollte ja auch erst mal nur klein anfangen. Dann hätte ich noch weiter gesehen. *g* Aber Zaphod hat es dann schon beendet. Doch hey, ich war schon recht nahe dran. *g*

omg…
wenn ich morgen nicht komme, habe ich mich erschossen.


Re: Aufgabe 2002-02-18 17:29
Princesa
kann mir einer sagen ob die musterloesung zu aufgabe 1c) von (aufgabenblatt 6) richtig ist? bei mir funktioniert sie nicht obwohl es doch eigentlich ganz logisch klingt, das ganze.

Re: Aufgabe 2002-02-18 17:52
Faleiro
Funktioniert das?

(define (subseq from to liste)
(take (+ (- to from) 1) (drop from liste)))


Re: Aufgabe 2002-02-18 17:56
Slater
nana, nicht so komliziert machen, der spassvogel von der musterlösung hat wohl keine zeit zum testen,
der fehler ist, das take und drop nicht den elementen nummern zuordnen (0 1 2 3 4…) sonder mit anzahlen arbeiten, nimm eins, drop zwei stück usw.,
kurzum, nach ein bisschen testen gehts so:

(define (subseq from to xs)
(drop from (take (+ 1 to) xs)))

die musterlösung ist also falsch, wie immer…


Re: Aufgabe 2002-02-18 18:04
Popcorn
Hmm?

(define (subseq from to xs)
(drop (- from 1) (take to xs)))

Die Musterlösung funktioniert doch bestens?!

Re: Aufgabe 2002-02-18 18:28
Slater
nicht mit der aufgabenstellung,
dort: (subseq 0 0 '(1 2)) -> (1)

in musterlösung: (subseq 0 0 '(1 2)) -> ()

also musterlösung falsch



Re: Aufgabe 2002-02-18 20:11
Princesa
man mußte einfach nur drop und take vertauschen , dann gings *g

Re: Aufgabe 2002-02-18 22:09
Fred
Wollte zur urspruenglichen Frage auch noch meinen Senf beitragen :-)

(define (member? x ys)
(if (null? ys) #f
(if (equal? x (car ys)) #t
(member? x (cdr ys)))))

(define (gleichkill xs)
(if (null? xs) '()
(let ((a (car xs)) (b (cdr xs)))
(if (member? a b) (gleichkill b)
(cons a (gleichkill b))))))

Ach ja und wie erreicht man, dass die fuehrenden Leerzeichen nicht rausgeschmissen werden? Gibt's da Tags fuer?