2010-12-04 17 views
4

Je n'arrive pas à ajouter une liste à une autre liste. Voici mon code. Quand je cours (ajouter '(1 2)' (3 4)) je reçois '(1 3 2 4).Procédure d'ajout de schéma

Je veux que la sortie soit « (1 2 3 4)

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

Merci

Répondre

10

bien en commutant les deux listes comme ça (commutation de la position de m et l lors de l'appel append récursivement), vous obtiendrez le premier élément de la première liste suivi du premier élément de la deuxième liste, etc.

Si vous ne le souhaitez pas, vous devez conserver l comme premier argument et m comme second. Ainsi, vous obtenez:

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

Bien sûr, cela ne fonctionne pas comme voulu non plus, parce que maintenant vous obtenez seulement la première liste et ne rien est joint en annexe du tout. Ce que vous devez faire est, une fois que la première liste est entièrement ajoutée (une fois l est vide), vous devez retourner le second comme la queue, comme ceci:

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

Wow. Dans mon code d'origine, je l'avais retourné, ce qui était encore pire parce que tout le reste. Merci beaucoup. –

0

je suis tombé sur ce temps moi-même l'étude . La réponse de @ sepp2k est une bonne instruction guidant OP pour corriger son code afin d'obtenir une définition récursive de append. Voici une autre définition de my-append en utilisant la fonction d'ordre supérieur foldr:

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