Scheme 方案-将列表添加到列表列表中?

Scheme 方案-将列表添加到列表列表中?,scheme,Scheme,我试图回答一个方案问题,对于这个问题的一部分,我必须列出一个列表: (define (join a b (result '())) (cons (list a b) result)) 所以我要输入两个字符,并将它们放在一个列表中,然后我需要将每个子列表放在一个列表中,这个函数每次用两个字符递归调用,所以它应该像这样工作: join 1 4 => ((1 4)) join 2 5 => ((1 4) (2 5)) join 3 6 => ((1 4) (2 5) (3 6)

我试图回答一个方案问题,对于这个问题的一部分,我必须列出一个列表:

(define (join a b (result '()))
  (cons (list a b) result))
所以我要输入两个字符,并将它们放在一个列表中,然后我需要将每个子列表放在一个列表中,这个函数每次用两个字符递归调用,所以它应该像这样工作:

join 1 4
=> ((1 4))
join 2 5
=> ((1 4) (2 5))
join 3 6
=> ((1 4) (2 5) (3 6))
(define (group-by-2 lst)
  (let loop ((lst lst) (rlst '()))
    (if (or (null? lst) (null? (cdr lst)))
        (rcons->cons rlst)
        (loop (cdr lst) 
              (rcons (list (car lst)
                           (cadr lst))
                      rlst)))))

(group-by-2 '(1 2 3 4 5 6 7 8))
; ==> ((1 2) (2 3) (3 4) (4 5) (5 6) (6 7) (7 8))

但是,我得到了
((36)(25)(14))
,因此元素需要反转,我尝试将
cons
函数反转为
(cons result(list a b))
,但随后我得到了
(((()14)2 5)3 6)
,我如何正确地获得列表,或者有更简单的方法来完成我正在做的事情

如果需要在列表末尾添加元素,请使用
append
cons
用于在头部添加元素。试试这个:

(define (join a b (result '()))
  (append result (list (list a b))))

请注意,
append
组合了两个列表,这就是为什么我们必须将新元素包围在它自己的
list
中。另外,在末尾添加元素也不是一个好主意,使用
append
比使用
cons
更昂贵-如果可能的话,重新考虑在头部添加元素的算法,并在末尾反转结果。

这很容易做到:

join 1 4
=> ((1 4))
join 2 5
=> ((1 4) (2 5))
join 3 6
=> ((1 4) (2 5) (3 6))
(define (group-by-2 lst)
  (let loop ((lst lst) (rlst '()))
    (if (or (null? lst) (null? (cdr lst)))
        (rcons->cons rlst)
        (loop (cdr lst) 
              (rcons (list (car lst)
                           (cadr lst))
                      rlst)))))

(group-by-2 '(1 2 3 4 5 6 7 8))
; ==> ((1 2) (2 3) (3 4) (4 5) (5 6) (6 7) (7 8))
现在,
rcons
类似于
cons
,但它会生成一个反向列表<代码>(rcons 1(rcons 2(rcons 3));=>{3 2 1}但是它不是一个列表,所以你必须把它转换成一个列表
(rcons->list(rcons 1(rcons 2(rcons 3));==>(3 2 1)

神奇的功能其实并没有那么神奇:

(define rcons cons)
(define rcons->cons reverse)

因此,事实上我并不需要进行这种抽象,但我希望我表达了我的观点。在程序中如何组织中间数据结构并不重要,所以为什么不尽可能做好你正在做的工作呢。对于列表,最好是从头到尾迭代,从头到脚。每次插入O(1)每一个元素,最后都做一个O(n)反转,它跳过“<代码>追加< /代码> n次,这将使它成为O(n))/p>你基本上试图“<代码>追加< <代码> >(列表A b)<代码> > <代码>结果< /代码>,因此考虑如何在方案中。