2010-12-07 4 views
2

Ich möchte eine Funktion in Lisp schreiben, die alle Elemente aus der Liste mit Map-Funktionen umkehrt, aber ich habe keine Ahnung, wie man das startet .. Ich denke, ich muss das eingebaute verwenden Umkehrfunktion irgendwie .. Zum Beispiel wenn ich die Liste (1 2 3 (4 5 6 (7 8 9))) hätte, würde ich (((9 8 7) 6 5 4) 3 2 1) oder wenn ich hatte die Liste (1 2 3 (4 5) (6 7)) würde ich bekommen ((7 6) (5 4) 3 2 1) .. Jede Hilfe ist willkommen!Lisp Reverse "all" Funktion

+0

Von Ihrem Kommentar unten, so scheint es, dass Sie ein rekursive Problem beschreiben, für die die einfachste Lösung, eine rekursive Funktion ist (eine Funktion, die sich selbst aufruft). Aus diesem Grund habe ich die Frage mit "Rekursion" markiert. –

Antwort

4

Nur eine schnelle Antwort, nicht sicher über Effizienz/elegancy:

(defun reverse-deeply (list) 
    (mapcar #'(lambda (li) 
       (cond 
       ((consp li) (reverse-deeply li)) 
       (t li))) 
      (reverse list))) 
+0

Der Schlüssel ist die Rekursion. Dies sollte es tun. –

+0

Ja das ist es .. Vielen Dank! – SnailBoy

0

Hier ist eine Version, die für mich in Common-Lisp funktioniert.

(defun reverse-list (list) 
    (if (atom list) 
     list ;; Not actually a list, return the atom 
     (reverse (mapcar #'reverse-list list))) 

;; Testing it out 
(reverse-list '((1 2 3) (4 5 (3 6)))) 

Output:

(((6 3) 5 4) (3 2 1)) 

mapcar ist eine Funktion, die eine andere Funktion als ersten Parameter und einer Liste als zweiten Parameter nimmt. Es ruft dann diese Funktion für jedes Element der Liste auf. Es gibt eine Liste aller Antworten zurück. Nachdem ich 'mapcar' benutzt habe, um alle Unterlisten rückgängig zu machen, rufe ich 'reverse' erneut an, um die größere Liste umzukehren.

Die Funktion, die auf jeder Unterliste aufgerufen wird, ist "Reverse-Liste". Dies überprüft, ob die Liste ein Atom ist. Wenn es ist, dann gibt es sich selbst zurück. Wenn es sich um eine Liste handelt, ruft sie mapcar erneut für jedes Element in der Liste auf und kehrt dann das Ergebnis um.

+0

Das ist nicht ganz das, was ich mir vorgestellt habe. Diese Funktion kehrt die Listen um, aber die Reihenfolge der Unterlisten muss umgekehrt werden. – SnailBoy

+0

Wenn jemand nicht weiß, wie 'mapcar' funktioniert, kann es verwirrend sein, da es zwei gibt Möglichkeiten, um das Ergebnis zu erreichen: a) die Top-Level-Container-Liste umzukehren; b) Reverse Member-Listen :) – khachik

+0

Das besser? Entschuldigung, ich muss verstanden haben, wonach Sie gefragt haben. –

0
(defun reverse-list (list) 
    (let ((result nil)) 
    (dolist (e list result) 
     (push e result))))
+0

Tut mir leid, es funktioniert nicht für mich ... – SnailBoy