2012-09-28 5 views
3

comment concevoir une fonction qui fusionne deux listes dans une liste. le premier élément de la première liste sera le premier élément de la nouvelle liste et le premier élément de la deuxième liste sera le deuxième élément de la nouvelle liste (a, b, c, d, e, f) (g, h, i) sera (a, g, b, h, c, i, d, e, f,)Scheme fusionner deux listes en une seule

Répondre

5

La procédure que vous essayez de mettre en œuvre est connu comme interleave ou merge. Parce que cela ressemble à des devoirs, je ne peux pas vous laisser une réponse claire, à la place, je vais vous orienter dans la bonne direction; remplir les blancs:

(define (interleave lst1 lst2) 
    (cond ((null? lst1)  ; If the first list is empty 
     <???>)   ; ... return the second list. 
     ((null? lst2)  ; If the second list is empty 
     <???>)   ; ... return the first list. 
     (else    ; If both lists are non-empty 
     (cons (car lst1) ; ... cons the first element of the first list 
       <???>)))) ; ... make a recursively call, advancing over the first 
          ; ... list, inverting the order used to pass the lists. 
+1

Merci beaucoup. – John

+1

Downvoter: vous voulez commenter? –

+0

@ ÓscarLópez: Je ne fais que deviner, mais le Downvoter pourrait s'opposer à ce "parce que ça ressemble à un peu de travail". J'ai eu cette même question en ce moment et j'utilise le schéma dans un environnement de travail. Peut-être que le Downvoter a été rebuté par la présomption qu'il s'agit de l'origine des devoirs. Encore une fois, je devine juste. –

12

Voici une implémentation purement fonctionnelle et récursive dans R6RS

(define (merge l1 l2) 
     (if (null? l1) l2 
      (if (null? l2) l1 
       (cons (car l1) (cons (car l2) (merge (cdr l1) (cdr l2))))))) 
1

Il n'y a pas besoin de vérifier les deux listes: Voici une version simple:

(define (interleave lx lz) 
    (cond 
    [(empty? lx) lz] 
    [else (cons (first lx)(interleave lz (rest lx)))])) 


(check-expect(interleave '() '())'()) 
(check-expect(interleave '(X X X X X X) '(O O O O O)) 
      (list 'X 'O 'X 'O 'X 'O 'X 'O 'X 'O 'X)) 
(check-expect(interleave '(1 2 3) '(a b c d e f)) 
      (list 1 'a 2 'b 3 'c 'd 'e 'f)) 
Questions connexes