0

((1 2)(3 4))のリストに入るとき、逆にしたいのですが、逆に((3 4)(1 2))とは逆にしたので、書き込もうとしています。ディープリバース手順:

(define (deep-reverse l)
  (cond ((null? l) nil)
        (not (pair? (car l)) l)
        (else (append (deep-reverse (cdr l)) (list (car l))))))

しかし、それはただスローバックします((1 2)(3 4))。何が問題で、どうすればこれを機能させることができますか?

4

3 に答える 3

4

試す:

(define (deep-reverse l) (map reverse l))

上記は可能な限り最も簡単な答えです。本当の答えは、ディープリバースに何を期待するかによって異なります。あなたの質問に対する私のコメントを参照してください。

すべてが必要な場合は、ずっと下に:

(define (deep-reverse l)
  (if (list? l)
      (reverse (map deep-reverse l))
      l))

これが(正しく)どのように機能するかです:

> (deep-reverse '(1 2 ((3.1 3.2) (4) "abc")))
(("abc" (4) (3.2 3.1)) 2 1)
于 2013-02-25T00:43:19.590 に答える
1

良いスタートは、リストに対して機能する逆の手順です。次に、リストの各車に再帰的に適用するように変更します。

(define (reverse x)
  (define (go items tail)
    (if (null? items) tail
        (go (cdr items) (cons (car items) tail))))
  (go x ()))

(define (deep-reverse x)
  (define (go items tail)
    (cond ((null? items) tail)
          ((not (pair? items)) items)
          (else (go (cdr items) (cons (go (car items) ()) tail)))))
  (go x ()))

ディープリバースのアプリケーションは次のようになります。

    (define x (list (list 1 (list 2 3) 4) 5 6 (list 7 8) 9 10)) (display x) (deep-reverse x)

   ((1 (2 3) 4) 5 6 (7 8) 9 10)
=> (10 9 (8 7) 6 5 (4 (3 2) 1))
于 2017-02-18T20:36:18.983 に答える
0

また、コードを深く逆にする必要がcarあります。それ以外の場合は、リストの最前部を深く反転させることはできません。

(define (deep-reverse l)
  (cond ((null? l) nil)
        (not (pair? (car l)) l)
        (else (append (deep-reverse (cdr l)) (list (deep-reverse (car l)))))))
于 2013-02-25T00:43:34.677 に答える