Scheme中的树的深度反转(Lisp)

zal*_*rak 4 lisp tree scheme reverse data-structures

我对Scheme中的基本树数据结构有一个深度反转

(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)
Run Code Online (Sandbox Code Playgroud)

我觉得更清洁,更好的结果是:

(4 3 (2 1))
Run Code Online (Sandbox Code Playgroud)

任何人都可以提供一些关于我在深度反转功能中出错的指导吗?谢谢.

Rör*_*örd 5

最好将任务分成简单的操作,而不是一次性完成所有操作.您想要实现的目标可以这样描述:反转当前列表本身,然后深度反转其中的所有子列表(或者反过来,这两个步骤的顺序并不重要.我选择此顺序,因为它导致更好的源代码格式化).

现在,标准库中已经有一个函数用于简单地反转列表reverse.所以你需要做的就是将它与那些作为子列表的元素的递归结合起来:

(define (deep-reverse t)
  (map (lambda (x)
         (if (list? x)
             (deep-reverse x)
             x))
       (reverse t)))
Run Code Online (Sandbox Code Playgroud)