我对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))
任何人都可以提供一些关于我在深度反转功能中出错的指导吗?谢谢。
答案 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
)。由于我们在列表列表上运行,因此必须在列表的car
和cdr
部分上调用递归。最后,我使用名为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