2012-01-10 9 views
4

私はスキームディープ・リバース(Lispの)

(define (deep-reverse t) 
    (cond ((null? t) '()) 
     ((not (pair? t)) t) 
     (else (cons (deep-reverse (cdr t)) (deep-reverse (car t)))))) 

(define stree (cons (list 1 2) (list 3 4))) 
1 ]=> (deep-reverse stree) 
;Value: (((() . 4) . 3) (() . 2) . 1) 

を基本的なツリーデータ構造のための深い逆を持って、私はクリーナーのように感じ、より良い結果が次のようになります。

(4 3 (2 1)) 

誰かが深い逆転機能でどこが間違っているのかについての指導をしてもらえますか?ありがとうございました。

答えて

5

タスクを一度に実行するのではなく、単純な操作に分割する方が良いです。あなたが達成したいことは以下のように記述することができます:現在のリストそのものを逆順にして、その中のすべてのサブリストを深く逆順に反転させます(あるいは、2つのステップの順序は関係ありません。ソースコードの書式設定がより良くなります)。

今、リストを単純に逆転させるための標準ライブラリにはすでに関数があります。reverse

(define (deep-reverse t) 
    (map (lambda (x) 
     (if (list? x) 
      (deep-reverse x) 
      x)) 
     (reverse t))) 
+0

ああ、ありがとう。私はライブラリ関数を避けようとしています(可能であれば、それは良いアイデアであるかどうかわかりません)が、リストを逆にすることはSchemeのやり方を知っていることです。 – zallarak

+0

コードを少し説明してもらえますか?私はそれを勉強すれば分かりますが、それは私には直感的ではありません。 – zallarak

+0

説明はほとんどの回答に既にあります。あなたがまだ知りませんが、 'map'は関数をリストのすべての要素に適用し、その結果を新しいリストに返します。 'lambda'は無名関数を定義します。 –

1

はこれを試してみてください:

(define (deep-reverse t) 
    (let loop ((t t) 
      (acc '())) 
    (cond ((null? t) acc) 
      ((not (pair? t)) t) 
      (else (loop (cdr t) 
         (cons (loop (car t) '()) acc)))))) 

はこのようにそれを呼び出します。逆リストを作成するための

(define stree (cons (list 1 2) (list 3 4))) 
(deep-reverse stree) 
> (4 3 (2 1)) 

、一つの技術は、パラメータに答えを蓄積することである(私は通常accそれを呼び出します)。リストのリストで操作しているので、リストのcarcdrの両方で再帰を呼び出す必要があります。

(define (deep-reverse t) 
    (aux t '())) 

(define (aux t acc) 
    (cond ((null? t) acc) 
     ((not (pair? t)) t) 
     (else (aux (cdr t) 
        (cons (aux (car t) '()) acc))))) 
:最後に、私は余分な機能の作成を回避するための省略形としてを聞かせて、同じ結果は二つのパラメータ、木とアキュムレータとヘルパー関数を定義することによって得ることができるという名前 を使用しています
+0

オスカーの説明に感謝します。私はまだループに精通していない、あなたはいくつかのクールな機能を私に供給してきました。 – zallarak

0

私はそれがより良いその要素数に基づいてリストを逆にすると思う:: 空のリストが逆である、単一だから、あなたがする必要があるすべてのサブリストされているそれらの要素に再帰とすることを組み合わせることです要素リストも元に戻ります.1つ以上の要素は、tailとheadの逆の連結です。

(defun deep-reverse (tree) 
    (cond ((zerop (length tree)) nil) 
     ((and (= 1 (length tree)) (atom (car tree))) tree) 
     ((consp (car tree)) (append (deep-reverse (cdr tree)) 
            (list (deep-reverse (car tree))))) 
     (t (append (deep-reverse (cdr tree)) (list (car tree))))))