Scheme 方案代码不为';行不通

Scheme 方案代码不为';行不通,scheme,sicp,Scheme,Sicp,我有一些代码,应该获取一个列表并返回该列表的相反部分。但是,它只返回列表。这是密码 (define (reverse listx) (define (thing list1 list2) (if (null? list1) list2 (thing (cdr list1) (append list2 (list (car list1)))) ) ) (thing listx nil) ) 我认为问题在于 (appen

我有一些代码,应该获取一个列表并返回该列表的相反部分。但是,它只返回列表。这是密码

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

不,不是这样:您确实调用了
(append list2(list…)
,第二个参数包含在
列表中

问题是,您使用的是
append
,而您应该在那里使用简单的
cons
)(事物(cdr列表1)(cons(汽车列表1)列表2))

使用
cons
list1
中的每个新元素将位于先前处理的元素的顶部(即“左侧”),从而以相反的方式生成结果:


但是使用
append
您只是在重新创建相同的列表。

当然,我对元素的重击感到困惑。非常感谢。我不认为append是个问题,而是它的参数顺序,尽管这里的首选过程是cons。
(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)