我有一些代码应该采用列表并返回该列表的反向。但是,它只返回列表。这是代码
(define (reverse listx)
(define (thing list1 list2)
(if (null? list1)
list2
(thing (cdr list1) (append list2 (list (car list1))))
)
)
(thing listx nil)
)
我认为问题取决于
这一事实 (append nil 1) => 1
而不是
(append nil 1) => (1)
答案 0 :(得分:3)
不,不是这样的:你打电话给(append list2 (list ...))
,第二个arg用list
括起来。
问题是您使用append
时应该使用简单cons
:(thing (cdr list1) (cons (car list1) list2))
。
使用cons
,来自list1
的每个新元素将在顶部(即“左侧”)之前处理的元素,因此构建结果反过来:
(a b c d e)
--------------------------
(a b c d e) ()
(b c d e) (a)
(c d e) (b a)
(d e) (c b a)
(e) (d c b a)
() (e d c b a)
--------------------------
(e d c b a)
但是使用append
,您只需重新创建相同的列表。