Question

J'utilise le schéma r5rs et je veux juste mettre en œuvre une fonction qui renvoie 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 résoudre ce problème? Je suis vraiment un débutant dans le schéma -. Ceci est mon premier travail en utilisant 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))
Était-ce utile?

La solution

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))))

Autres conseils

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 effectivement ajoutant que:

(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 devrez probablement chercher la définition de do si vous voulez vraiment l'utiliser.)

Vous pouvez remarquer que c'est assez laid. C'est parce que personne ne fait cette façon. , Vous avez au lieu de se rendre compte que l'appel d'une fonction crée une nouvelle variable aussi bien. 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, puis appelez votre fonction à nouveau. Si vous éprouvez des difficultés à voir pourquoi cela fonctionne, exécutez cette fonction au lieu de 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)))))

Voici quelques elisp simpliste:

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

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)

Vous êtes mieux d'utiliser opérations ensemblistes de SRFI-1.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top