2010-12-07 11 views
2

マップ関数を使用してリストからすべての要素を逆順にする関数を記述したいが、これをどのように開始するのかわからない。何らかの形で逆関数を返します。 たとえば、リスト(1 2 3(4 5 6(7 8 9))を持っていれば、((9 8 7)6 5 4)3 2 1) リストを持っていた(1 2 3(4 5)(6 7))私は((7 6)(5 4)3 2 1).. 助けていただきありがとうございます!Lisp Reverse "all" Function

+0

は、あなたが最も簡単な解決策は、再帰関数であるために再帰的な問題を、(記述されているようですつまり、自分自身を呼び出す関数)。私はその理由のために "再帰"で質問にタグを付けました。 –

答えて

4

だけで簡単に答え、:以下のコメントから

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

キーは再帰です。これはそれを行う必要があります。 –

+0

はいこれです..ありがとうございます! – SnailBoy

0

ここでは、Common-Lispで私にとって役立つバージョンです。

(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)))) 

出力:

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

でmapcarは、その最初のパラメータと第二パラメータとしてリストとして他の関数を取る関数です。次に、リストの各要素でその関数を呼び出します。すべての回答のリストを返します。だから私はすべてのサブリストを逆にするために 'mapcar'を使用した後、私は大きなリストを逆にするために再び '逆'を呼び出します。

各サブリストで呼び出す関数は 'reverse-list'です。これは、リストがアトムかどうかをチェックします。存在する場合は、それ自身を返します。それがリストであれば、リストの各要素に対してmapcarを再度呼び出し、その結果を逆にします。効率/優雅わからない

+0

これは私が心に留めていたものではありません。この関数はリストを逆転させますが、サブリストの順序も逆にする必要があります。 – SnailBoy

+0

'mapcar'の仕組みが分からない人は、混乱するかもしれません。結果を達成する方法:a)トップレベルコンテナリストを逆転させる。 b)逆のメンバーリスト:) – khachik

+0

それは良い?申し訳ありませんが、私はあなたが求めていたものを誤解しているに違いありません。 –

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

申し訳ありませんが私のために働いていません... – SnailBoy