方案代码不起作用

时间:2014-03-15 09:54:53

标签: scheme sicp

我有一些代码应该采用列表并返回该列表的反向。但是,它只返回列表。这是代码

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

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,您只需重新创建相同的列表。