FB18 - Das Forum für Informatik

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

Aufgabenblatt 6???

Aufgabenblatt 6??? 2002-01-09 17:42
Tanki
Hi!

Hat irgendjemand eine Idee, wie ich mein kleines Scheme Programm abändern kann, damit es zu 1a passt?

(define (take item xs)
(if (equal? item (car (reverse xs)))
xs
((take item (cdr (reverse xs)))
(reverse xs))))

Da passt alles hinten und vorne nicht, und funktioniert nur, wenn man das letzte Element der Liste eingibt… :-(

Gruss,
Tanki

Re: Aufgabenblatt 6??? 2002-01-11 15:46
Chandler
Keine Ahnung, ob man deine Lösung so abändern kann, so dass sie funktioniert. Aber du kannst ja mal meine ausprobieren, müsste eigentlich funktionieren, falls es nicht richtig ist bitte melden.

(define (take anzahl2 liste)
(cond ((= anzahl2 (length liste)) liste)
((> anzahl2 (length liste)) 'Liste_zu_kurz)
(else (take anzahl2 (reverse (cdr (reverse liste)))))))



Re: Aufgabenblatt 6??? 2002-01-11 16:50
Zaphod
Hmmm…meine Lösung sieht etwas anders aus…aber sie funktioniert! Der 2. Ansatz ist aber auch richtig, soweit ich das sehe…hab ich noch nicht ausprobiert. Ob es sinnvoll ist, dass 'Liste_zu_kurz als Zeichenkette zurückgegeben wird und nicht als Fehler gemeldet wird, darüber lässt sich streiten.

Hier meine:

(define (take n liste) ;gibt die ersten n Elemente der liste
;zurück
(cond
((= n 0) '()) ;Rekursioinsabschluss
((null? liste)(error "Feher: Liste zu kurz!")) ; klar!
(else ;ansonsten soll das erste Element vor das Ergebnis
;gehängt werden, das sich ergibt, wenn man die n-1
;ersten Elemente der Restliste fordert.
(cons (car liste) (take (- n 1) (cdr liste))))))

Zu der ersten Lösung weiß ich nichts zu sagen, außer dass es sinnvoll ist, Variablen einen 'klingenden' Namen wie 'liste' zu geben und ein Programm zu kommentieren oder zumindest die Idee zu erläutern.

Re: Aufgabenblatt 6??? 2002-01-11 17:15
Zaphod
So. Hier noch die Lösung für 1.2 und 1.3

(define (drop n liste);entfernt die ersten n Elemente der liste
(cond
(( = n 0) liste) ;Rekursionsabschluss
((null? liste)(error "Liste zu kurz"))
(else
(drop (- n 1) (cdr liste))))) ;Rekursionsschritt

(define (subseq to from liste);ermittelt den Ausschnitt einer
;Liste von from bis to
(cond
((< to from)(error "to < from"));klar
(else
(drop from (take to liste)))));auch klar

Re: Aufgabenblatt 6??? 2002-01-18 14:32
Chandler
Hat jemand eine Idee zu Aufgabe 5? Es reicht auch erst mal was für symmetrisch? .

Re: Aufgabenblatt 6??? 2002-01-18 18:12
Chandler
Schreibt doch zumindest, dass ihr auch keine Ahnung habt. Dann komme ich mir nicht so allein vor.[img]http://images.rapidforum.com/images/i9.gif[/img]
Vielleicht denke ich ja auch nur zu kompliziert, werde noch eine Nacht drüber schlafen und morgen noch mal anschauen.

Re: Aufgabenblatt 6??? 2002-01-18 22:07
Zaphod
Also, ich habe die AUfgabe noch nicht angefangen, aber im Prinzip müsste es doch um Folgendes gehen:
Man erstellt sich ein Hilfsprädikat, welches überprüft, ob für ein bestimmtes Element (a . b) der Relation auch (b . a) in der Relation enthalten ist. Dieses wendet man dann auf jedes einzelne Element der Relation an. Dabei sollte man allerdings beachten, dass (for-all p? relation) nach und nach die Elemente aus relation entfernt, sodass am Ende der Rekursion ein einzelnes Element darin enthalten ist, zu dem es natürlich keinen Partner gibt. Daher erstellt man sich zunächst eine Kopie von relation und benutzt diese beim Vergleich, sodass es egal ist, dass relation immer weniger wird.
Ich hoffe, das funktioniert so…probiers doch mal aus.
Für die anderen Eigenschaften einer Relation musst du dir entsprechende Hilfsprädikate erschaffen, die das im Einzelnen überprüfen (ich glaube, Transitivität ist ziehmlich doof…)

Re: Aufgabenblatt 6??? 2002-01-18 22:21
Popcorn
Und ich habe mir die noch überhaupt nicht angesehen.

Re: Aufgabenblatt 6??? 2002-01-18 22:55
Faleiro
Hättet ihr das nicht irgendwie am Freitag abgeben müssen???

Re: Aufgabenblatt 6??? 2002-01-18 23:13
Zaphod
Keine Ahnung…als ich die Aufgabe mit dem Knoten gesehen hatte (Aufgabenzettel 1), beschloss ich, den Schein nicht zu machen, weil mir das zu doof war…schließlich braucht man den nicht.

Re: Aufgabenblatt 6??? 2002-01-19 11:48
Zaphod
So. Hier mal eine Lösung für eine symmetrische Relation: (zur Sicherheit auch noch for-all und there-is, allerdings unkommentiert, weil ich zu faul bin, wer Lust hat, der erarbeite sich das, es ist einfach ;-) )
(define (there-is p? liste) (cond ((null? liste) #f) ((p? (car liste)) #t) (else (there-is p? (cdr liste))))) (define (for-all p? liste) (cond ((null? liste)#t) ((not (p? (car liste)))#f) (else (for-all p? (cdr liste))))) (define (symmetrisch? relation) ;also aRb ==> bRa für alle a,b E R (let ((sym? (lambda (paar) (member (cons (cdr paar)(car paar)) relation)))) ;sym? überprüft, ob zu einem Element der Relation auch das "Inverse" ;des Elements drin ist (for-all sym? relation))) ;Definition einer symmetrischen Relation. [code] Es freut mich, dass [ CODE ] mittlerweile funktioniert, aber warum ist jetzt alles zweizeilig geschrieben? Das was ich weiter oben mit der Kopie der relation gemeint hatte, war Unsinn. Schließlich wird beim Aufruf von for-all bereits eine neue Variable bereitgestellt.