2010-12-04 62 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))