Scheme

sanni7

Grünschnabel
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
 
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:

Code:
func X => [ firsts(X) ] + func(reste(X))
Gruß

PS: Es gibt auch noch eine sehr elegante Möglichkeit dies in Scheme zu tun. Verrate ich dir aber erst später... ;)
 
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)))))))
 
Zuletzt bearbeitet:
Leider ist mir keine Funktion bekannt um elegant die ersten verschwinden zu lassen.
wenn ich nur eine liste hätte würde ich ja einfach mit dem cdr l weiterarbeiten, aber die kann ich ja leider nicht aneinander "consen"
Du solltest dir erstmal eine Funktion wie firsts schreiben welche nur die Reste, also die cdr, der Unterlisten der Gesamtliste zurückgibt:
Code:
reste X = cons(cdar(X), reste(X))
Gruß
 
Zuletzt bearbeitet:
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
 
Hi.

Bitte halte dich an die Netiquette, insbesondere Punkt 15, Groß-/Kleinschreibung. Danke!
irgendwie fehlt mir der letzte schritt zur rekursivität
Ja, dann ruf doch die Funktion rekursiv auf! Warum wendest du denn die firsts Funktion 2 Mal an? Schau dir nochmal den Pseudocode von mir an.

Und bitte verwende für Code die Code Tags!

Gruß
 
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:
(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
 
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:
(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
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ß
 
Zurück