2016-09-17 7 views
2

Ich möchte eine Liste kleinerer Listen aufnehmen und eine Kopie des ersten Elements jeder kleinen Liste am Ende jeder kleinen Liste hinzufügen. Wenn das keinen Sinn ergibt, gebe ich Ihnen ein Beispiel:Rekursives Hinzufügen zur Liste gibt null zurück

f ({(0, 0, 1), (1, 0, 0), (0, 1, 0), .. .}) = {(0, 0, 1, 0), (1, 0, 0, 1), (0, 1, 0, 0), ...}

Das ist, was ich habe so weit:

(define (add-end n set) 
    (cond 
    ((null? set) '()) 
    (cons (append (first set) (first (first set))) 
      (add-end n (rest set))))) 

Das hält mir ein null-Ergebnis zu geben, und ich weiß nicht genau, warum.

Antwort

1

Ihr Code schlägt fehl, weil Sie den else Teil in der cond Ausdruck vergessen haben, auch die Art, wie Sie appending ein einzelnes Element an das Ende einer Liste ist falsch. Dies sollte die Probleme beheben:

(define (add-end set) 
    (cond ((null? set) 
     '()) 
     (else 
     (cons (append (first set) (list (first (first set)))) 
       (add-end (rest set)))))) 

Aber warten Sie, es gibt eine einfachere Lösung, wenn wir bestehende Verfahren:

(define (add-end set) 
    (map (lambda (lst) 
     (append lst (list (first lst)))) 
     set)) 

Erläuterung:

  • Wir haben keine n Parameter benötigen - Zum Verarbeiten einer Liste müssen wir ihre Länge selten im Voraus kennen
  • Beachten Sie, dass wir jedes Element der Eingabeliste zu c verarbeiten müssen eine neue Ausgabeliste reate, map mit der Art und Weise wird in diesen Fällen
  • Jetzt ist es einfach eine Frage der append ing das erste Element jeder Liste
  • bauen eine richtige Liste zu gehen, denken Sie daran, dass append setzt voraus, dass beide seiner Argumente sind Listen, dass das Bit mit dem (list (first lst))

so oder so, es funktioniert wie erwartet, erklärt:

(add-end '((0 0 1) (1 0 0) (0 1 0))) 
=> '((0 0 1 0) (1 0 0 1) (0 1 0 0)) 
+0

ich sehe jetzt. Was gab mir vorher null? – CompNoob

+0

@CompNoob es scheiterte, weil Sie das "else" vergessen haben. Der "cons" -Teil der Bedingung hatte keine Wirkung. –