Listen

  • 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
  • Hallo,

    sorry, kommt etwas spät die Antwort. ;) Aber hier noch eine Löungsidee, falls du das Problem nicht schon selbst gelöst hast:

    Du hast ja jetzt schon die Funktion firsts, die von allen Listen die ersten Elemente in einer neuen Liste speichert. Wenn du dir jetzt noch eine Funktion tails schreibst, die nach dem gleichen Prinzip arbeitet, aber die Restlisten (also immer ohne das erste Elment) in einer Liste speichert, dann kannst du mit einer dritten Funktion (ich hab die mal transpose genannt) über firsts das erste Element berechnen und dann rekursiv mit lasts die anderen. Und zum Schluß fügst du mit cons immer das Ergebnis von firsts und dem rekursiven Aufruf von transpose zusammen.

    Das Prinzip mal an deinem Beispiel erklärt:
    [code:1]transpose ((1 2 3) (4 5 6) (7 8 9)):
    firsts -> (1 4 7)
    lasts -> ((2 3) (5 6) (8 9))
    transpose ((2 3) (5 6) (8 9)):
    firsts -> (2 5 8)
    lasts -> ((3) (6) (9))
    transpose ((3) (6) (9)):
    firsts -> (3 6 9)
    lasts -> (() () ())
    transpose (() () ())
    -> () // Rekursionsende
    -> ((3 6 9))
    -> ((2 5 8) (3 6 9))
    -> ((1 4 7) (2 5 8) (3 6 9))
    [/code:1]

    Hoffe das war verständlich erklärt. :)


    Viele Grüße,

    Siracusa