ERLEDIGT
NEIN
NEIN
ANTWORTEN
15
15
ZUGRIFFE
641
641
EMPFEHLEN
-
Hallo zusammen,
ich soll einer Funktion erstellen, die folgendes macht: ((1 2 3) (4 5 6) (7 8 9)) -> ((1 4 7) (2 5 8 ) (3 6 9)) also jeweils die ersten der einzelnen Listen zu einer neuen Liste, die zweiten etc. Wie ich an die ersten komme und daraus eine Liste hinbekomme habe ich so gemacht:
(define firsts
(lambda (l)
(cond
((empty? l) '())
(else (cons (car (car l)) (firsts (cdr l)))))))
Aber wie rufe ich das nun nochmal auf, quasi ohne die ersten der Liste, um dann wiederum die neuen ersten (also die jetzigen 2ten) aneinanderzufügen? Und vor allem wie merke ich mir die Liste?
Wäre super, wenn mir jemand helfen kann
-
10.02.09 16:03 #2
- Registriert seit
- Jun 2005
- Beiträge
- 8.169
Hi.
Welche Funktionen kennst du denn schon?
Du müßtest im Grunde zu der Liste die du mit firsts bekommst nur noch die Liste dranhängen die du bekommst indem du aus allen Listen das erste Element entfernst und darauf noch mal die eigentliche Funktion anwendest:
GrußCode :1
func X => [ firsts(X) ] + func(reste(X))
PS: Es gibt auch noch eine sehr elegante Möglichkeit dies in Scheme zu tun. Verrate ich dir aber erst später...
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Leider ist mir keine Funktion bekannt um elegant die ersten verschwinden zu lassen.
Dieses hier ist meine Version, die ersten zu entfernen:
(define remove-firsts
(lambda (l)
(cond
((empty? l) '())
(else (cons(cdr (car l)) (remove-firsts (cdr l)))))))Geändert von sanni7 (10.02.09 um 16:16 Uhr)
-
10.02.09 16:17 #4
- Registriert seit
- Jun 2005
- Beiträge
- 8.169
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
gerade geschehen
siehe oben
-
10.02.09 16:31 #6
- Registriert seit
- Jun 2005
- Beiträge
- 8.169
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
irgendwie fehlt mir der letzte schritt zur rekursivität
(define umformung
(lambda (l)
(cond
((empty? l) '())
(else
(cons (firsts l)(cons(firsts (remove-firsts l))'())))
)
)
)
so habe ich jetzt die ersten und die zweiten aneinander, aber irgendwie funktionieren meine ganzen versuche, das ganze rekursiv zu machen nicht...
Bsp.
(umformung '((1 2 3) (4 5 6) (7 8 9)) --> ((1 4 7) (2 5 8)), aber ich möchte (3 6 8) ja auch noch enthalten haben, bzw. beliebig viele, wenn die liste 4 listen enthält soll er natürlich alleine auch die vierten ranhängen
-
10.02.09 19:17 #8
- Registriert seit
- Jun 2005
- Beiträge
- 8.169
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Entschuldige, war keine Absicht. Danke für den Hinweis.
Ich weiß theoretisch, dass ich das mit einer Rekursion machen muss, leider weiß ich nicht, wie man das praktisch macht
Code :1 2 3 4 5 6 7 8
(define transpose (lambda (l) (cond ((empty? l) '()) (else (cons (firsts l)(transpose (remove-firsts l))))) ) )
Das war mein Versuch deinen Pseudocode umzusetzen, aber dann bekomme ich die Fehlermeldung, dass () gegeben ist, er aber ein Argument vom Typ pair erwartet
-
10.02.09 20:07 #10
- Registriert seit
- Jun 2005
- Beiträge
- 8.169
OK. Das liegt noch an der remove-firsts Funktion, da diese für den Parameter ((3) (6) (9)) den Wert (() () ()) zurückliefert. Ein weiterer Aufruf der Funktion schlägt dann natürlich fehl, da du keine Elemente mehr aus den leeren Unterlisten entfernen kannst. Du müßtest also prüfen, ob auch die Unterliste nicht leer ist.
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Ich glaube ich habs jetzt:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13
(define transpose (lambda (l) (cond ((empty? l) '()) (else (cond ((empty? (car l)) '()) (else (cons (firsts l)(transpose (remove-firsts l))))) ) ) ) )
Vielen Dank für deine Hilfe!
-
10.02.09 20:18 #12
- Registriert seit
- Jun 2005
- Beiträge
- 8.169
Ja, so herum ist es sogar besser, da nun folgendes relativ auffällig ist:
Im Grunde hast du - bis auf eine Kleinigkeit - 2 Mal die gleiche Funktion definiert. Einmal firsts und dann remove-firsts. Diese Funktionen haben im Grunde die gleiche Struktur. Und zwar wird in beiden auf jedem Element einer Liste eine Funktion ausgeführt und das Ergebnis ist eine Liste die aus den Ergebnissen gebildet wird.
Da kann man sich gleich eine allgemeine Funktion bauen:
Kannst ja mal überlegen was in die Fragezeichen eingesetzt werden muss.Code :1 2 3 4 5 6 7 8 9 10 11 12 13
(define (funktion-auf func liste) (cond ((empty? liste) liste) (else (cons (func (car liste)) (funktion-auf func (cdr liste)))))) ;; Funktion firsts: (define (firsts x) (funktion-auf ? x)) ;; Funktion remove-firsts: (define (remove-firsts x) (funktion-auf ? x))

GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Stimmt, die sind ja echt total gleich. Man bin ich blind
Danke für den Hinweis.
Meine Fassung sieht jetzt so aus:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
(define hilfs-func (lambda (func l) (cond ((empty? l) '()) (else (cons (func(car l))(hilfs-func func(cdr l))))))) (define (firsts l) (hilfs-func car l)) (define (remove-firsts l) (hilfs-func cdr l)) (firsts '((1 2 3)(4 5 6) (7 8 9))) (remove-firsts '((1 2 3) (4 5 6))) (define transpose (lambda (l) (cond ((empty? l) '()) (else (cond ((empty? (car l)) '()) (else (cons (firsts l)(transpose (remove-firsts l))))) ) ) ) )
-
10.02.09 20:41 #14
- Registriert seit
- Jun 2005
- Beiträge
- 8.169
Ja, sieht gut aus. Aber natürlich gibt es bereits eine Funktion die eine Funktion auf jedes Element einer Liste anwendet und eine Liste der Resultate zurückgbit, sie heißt map.

Wie angesprochen gibt es noch eine sehr elegante Möglichkeit eine Liste von Listen zu transponieren in Scheme, aber dazu braucht man noch eine andere Funktion; und das führt jetzt womöglich zu weit...
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Ein anderes Mal gerne für heute reicht es erst einmal

Gruß
Ähnliche Themen
-
SCHEME Rekursiver aufruf.
Von Mikrowelle im Forum Sonstige SprachenAntworten: 1Letzter Beitrag: 10.01.11, 08:44 -
SCHEME generierung von Listen
Von Mikrowelle im Forum Sonstige SprachenAntworten: 0Letzter Beitrag: 06.01.11, 15:47 -
SCHEME Multiplikation mit einer Liste
Von Mikrowelle im Forum Sonstige SprachenAntworten: 4Letzter Beitrag: 02.01.11, 15:12 -
[QUIZ#9] RedWing (Scheme)
Von RedWing im Forum ArchivAntworten: 0Letzter Beitrag: 25.07.09, 22:58 -
[QUIZ#7] RedWing (Scheme und Bash)
Von RedWing im Forum ArchivAntworten: 2Letzter Beitrag: 09.12.08, 19:27





Zitieren

Login





