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

时间:2012-01-10 01:42:27

标签: data-structures tree lisp scheme reverse

我对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)

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

(4 3 (2 1))

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

4 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分: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部分上调用递归。最后,我使用名为let 的作为避免创建额外函数的简写,但是通过使用两个参数(树和累加器)定义辅助函数可以获得相同的结果:

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

答案 2 :(得分:0)

我认为最好根据元素计数来反转列表: 一个空列表是反向的,单个元素列表也被还原,超过1个元素是尾部和头部反转的串联。

$http({
        method : 'POST',
        url : 'AddResource',
        data: empObj,
        headers: { 'Content-Type': 'application/json' }
    }).then(function successCallback(response) {
        if(response.data){
            $scope.getEmployee();
        }
    }, function errorCallback(response) {
        console.log("Data not coming");
    });

答案 3 :(得分:0)

以下对我有用:

(define (deep-reverse tree)
  (define (deep-reverse-iter items acc)
    (cond
      ((null? items) acc)
      ((not (pair? items)) items)
      (else (deep-reverse-iter
        (cdr items)
        (cons (deep-reverse (car items)) acc)))))
  (deep-reverse-iter tree ()))

(define x (list (list 1 2) (list 3 4 (list 5 6))))

(newline)
(display (deep-reverse x))

它按预期打印(((6 5) 4 3) (2 1)),并使用最少的标准库函数:pair?检查树是否为cons,而null?检查树是否为空/列表。

此树解决方案是列表的reverse函数的概括:

(define (reverse items)
  (define (reverse-iter items acc)
    (cond
      ((null? items) acc)
      ((not (pair? items)) items)
      (else (reverse-iter (cdr items) (cons (car items) acc)))))
  (reverse-iter items ()))

区别在于deep-reverse也适用于car items