2010-12-04 65 views
4

我无法将列表附加到另一个列表。以下是我的代码。当我跑步时(追加'(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))))) 

由于

回答

10

井通过围绕切换两个列表那样的(呼叫附加递归当开关的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

的另一个定义哇。在我原来的代码中,我让它返回,这更糟,因为它包含了所有内容。非常感谢。 – 2010-12-05 00:04:13

0

我碰到这个而来到学习自己。 @ sepp2k的答案是一条很好的指导OP的指令,用于纠正他们的代码以实现append的递归定义。下面是my-append使用高阶函数foldr

(define (myappend xs ys) 
    (foldr cons ys xs))