tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
15
ZUGRIFFE
641
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    sanni7 sanni7 ist offline Mitglied
    Registriert seit
    Jun 2007
    Beiträge
    13
    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
     

  2. #2
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    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:

    Code :
    1
    
    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...
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  3. #3
    sanni7 sanni7 ist offline Mitglied
    Registriert seit
    Jun 2007
    Beiträge
    13
    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)
     

  4. #4
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.169
    Zitat Zitat von sanni7 Beitrag anzeigen
    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 :
    1
    
    reste X = cons(cdar(X), reste(X))
    Gruß
    Geändert von deepthroat (10.02.09 um 16:22 Uhr) Grund: muss natürlich cdar heißen, nicht cadr
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  5. #5
    sanni7 sanni7 ist offline Mitglied
    Registriert seit
    Jun 2007
    Beiträge
    13
    gerade geschehen siehe oben
     

  6. #6
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.169
    Zitat Zitat von sanni7 Beitrag anzeigen
    gerade geschehen siehe oben
    Gut. Jetzt kannst du damit deine eigentliche Funktion erstellen. Dazu mußt du nur zu den ersten Elementen die du mit firsts bekommst das Ergebnis der Funktion anhängen die du mit den Rest-Elementen als Parameter aufrufst. (siehe Pseudo-Code oben)

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  7. #7
    sanni7 sanni7 ist offline Mitglied
    Registriert seit
    Jun 2007
    Beiträge
    13
    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
     

  8. #8
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.169
    Hi.

    Bitte halte dich an die Netiquette, insbesondere Punkt 15, Groß-/Kleinschreibung. Danke!
    Zitat Zitat von sanni7 Beitrag anzeigen
    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ß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  9. #9
    sanni7 sanni7 ist offline Mitglied
    Registriert seit
    Jun 2007
    Beiträge
    13
    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. #10
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.169
    Zitat Zitat von sanni7 Beitrag anzeigen
    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
    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.

  11. #11
    sanni7 sanni7 ist offline Mitglied
    Registriert seit
    Jun 2007
    Beiträge
    13
    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!
     

  12. #12
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.169
    Zitat Zitat von sanni7 Beitrag anzeigen
    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)))))
                 ) 
               )
        )
      )
    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:
    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))
    Kannst ja mal überlegen was in die Fragezeichen eingesetzt werden muss.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  13. #13
    sanni7 sanni7 ist offline Mitglied
    Registriert seit
    Jun 2007
    Beiträge
    13
    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)))))
                 ) 
               )
        )
      )
     

  14. #14
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    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.

  15. #15
    sanni7 sanni7 ist offline Mitglied
    Registriert seit
    Jun 2007
    Beiträge
    13
    Ein anderes Mal gerne für heute reicht es erst einmal

    Gruß
     

Ähnliche Themen

  1. SCHEME Rekursiver aufruf.
    Von Mikrowelle im Forum Sonstige Sprachen
    Antworten: 1
    Letzter Beitrag: 10.01.11, 08:44
  2. SCHEME generierung von Listen
    Von Mikrowelle im Forum Sonstige Sprachen
    Antworten: 0
    Letzter Beitrag: 06.01.11, 15:47
  3. SCHEME Multiplikation mit einer Liste
    Von Mikrowelle im Forum Sonstige Sprachen
    Antworten: 4
    Letzter Beitrag: 02.01.11, 15:12
  4. [QUIZ#9] RedWing (Scheme)
    Von RedWing im Forum Archiv
    Antworten: 0
    Letzter Beitrag: 25.07.09, 22:58
  5. [QUIZ#7] RedWing (Scheme und Bash)
    Von RedWing im Forum Archiv
    Antworten: 2
    Letzter Beitrag: 09.12.08, 19:27