2010-03-29 2 views
1

J'utilise R5RS Scheme et je veux juste implémenter une fonction qui retourne l'intersection de deux listes données, mais je ne peux pas le faire parce que je ne peux pas ajouter un élément à une liste . Voici mon code. Comment puis-je le réparer? Je suis vraiment un débutant dans Scheme - c'est mon premier travail en utilisant Scheme.Ajout d'un élément à une liste dans le schéma

thx à l'avance ..

(define list3 '()) 
(define (E7 list1 list2) 

     (cond 
      ((null? list1) 
      list3) 
      ((member (car list1) list2) (append list3 (list (car list1)))) 

     ) 
    (cond 
      ((null? list1) 
      list3) 
      ((not(null? list1)) (E7 (cdr list1) list2) 

     ) 

    ) 


) 
(E7 '(4 5) '(3 4)) 
+0

ressemble plus à Scheme que Lisp. –

+2

Le schéma est un Lisp. – Ken

Répondre

1

Voici une version récursive qui fait l'intersection au lieu de l'union.

(define (intersect list1 list2) 
    (cond ((null? list1) list1) 
     ((member (car list1) list2) (cons (car list1) (intersect (cdr list1) list2))) 
     (t (intersect (cdr list1) list2)))) 
0

Voici quelques elisp simpliste:

(defun is (l1 l2) 
    (let ((rtn)) 
    (mapc 
     (lambda (e) 
     (if (member e l1) 
      (push e rtn))) 
     l2) 
    rtn)) 

Ce se comporte comme l'intersection intégrée pour ces tests simples:

(is '(1 2 5) '(1 4 10 5)) => (5 1) 
(intersection '(1 2 5) '(1 4 10 5)) => (5 1) 

(is '(1 4 10 5) '(1 2 5)) => (5 1) 
(intersection '(1 4 10 5) '(1 2 5)) => (5 1) 
+0

ne peut pas exécuter ce code. que dois-je faire pour exécuter ceci dans drscheme: s thx btw – user272483

+0

Désolé, pas sûr, je ne suis pas familier avec drscheme. Comme je l'ai dit, c'est élisp. En regardant votre code, est-ce que vous devez utiliser "define" au lieu de "defun"? – killdash10

+0

oui effectivement defun ne fonctionne pas pour moi et je ne sais pas comment utiliser defun – user272483

0

Je pense que je vois votre problème. Il y a deux façons d'ajouter un élément à une liste.

La première serait en fait d'ajouter qu'il:

(define (intersect list1 list2) 
    (define newlist list2) 
    (do ((iter1 list1 (cdr iter1))) 
    (not (null? iter1)) 
    (if (not (member (car iter1) newlist)) 
     (set! newlist (cons (car iter1) newlist))))) 

(Vous aurez probablement à chercher la définition de do si vous voulez vraiment l'utiliser.)

Vous pouvez remarquer que c'est plutôt moche. C'est parce que personne ne le fait de cette façon. Au lieu de cela, vous devez réaliser qu'appeler une fonction crée également une nouvelle variable. Essayez ceci:

(define (intersect list1 list2) 
    (cond ((null? list1) list2) 
     ((member (car list1) list2) (intersect (cdr list1) list2)) 
     (else (intersect (cdr list1) (cons (car list1) list2))))) 

Si vous êtes familier avec les algorithmes, vous remarquerez que le code que je viens d'écrire est assez lent, mais il illustre le point: dans chaque cas, vous faites un peu de travail et puis appelez à nouveau votre fonction. Si vous éprouvez des difficultés à voir pourquoi cela fonctionne, exécutez cette fonction plutôt sur votre exemple:

(define (intersect list1 list2) 
    (display list1) (display " ") (display list2) (newline) 
    (cond ((null? list1) list2) 
     ((member (car list1) list2) (intersect (cdr list1) list2)) 
     (else (intersect (cdr list1) (cons (car list1) list2))))) 
+0

merci beaucoup mais il semble que vous l'avez fait pour obtenir l'union de deux listes, mais je veux prendre l'intersection des listes. – user272483

+0

Oh, tire. Tu as raison. Cela trouvera l'union. La fonction d'intersection devrait être similaire, mais commencez par '() au lieu de list2 comme liste de travail. (Vous devrez peut-être ajouter un troisième argument à la fonction.) –

Questions connexes