计划追加程序

时间:2010-12-04 22:32:34

标签: scheme append

我无法将列表附加到另一个列表中。以下是我的代码。当我跑步时(追加'(1 2)'(3 4))我得到'(1 3 2 4)。

我希望输出为'(1 2 3 4)

(define (append l m)
 (if (null? l) '()
  (cons (car l) (append m (cdr l)))))

由于

2 个答案:

答案 0 :(得分:12)

通过像这样切换两个列表(在递归调用append时切换m和l的位置),你将获得第一个列表的第一项,然后是第二个列表的第一项等。

如果你不想那样,你应该把l作为第一个参数,m作为第二个参数。所以你得到:

(define (append l m)
 (if (null? l) '()
  (cons (car l) (append (cdr l) m))))

当然这也不会像想要的那样工作,因为现在你只得到第一个列表而且根本没有附加任何内容。你需要做的是,一旦第一个列表完全附加(即l为空),你需要将第二个列表作为尾部返回,如下所示:

(define (append l m)
 (if (null? l) m
  (cons (car l) (append (cdr l) m))))

答案 1 :(得分:0)

我在学习自己时遇到过这个问题。 @ sepp2k的答案是一条很好的指令,指导OP纠正他们的代码以实现追加的递归定义。以下是使用高阶函数my-append的{​​{1}}的替代定义:

foldr