Pregunta

Estoy usando R5RS Esquema y sólo quiero poner en práctica una función que devuelve la intersección de las dos listas dadas, pero no puedo hacer eso porque no puedo agregar un elemento a una lista. Aquí está mi código. ¿Cómo puedo arreglarlo? Estoy realmente un principiante en el Esquema -. Este es mi primer trabajo utilizando el esquema

THX de antemano ..

(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))
¿Fue útil?

Solución

Esta es una versión recursiva que hace el cruce en lugar de la unión.

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

Otros consejos

creo ver su problema. Hay dos formas de añadir un elemento a una lista.

La primera manera sería realmente añadiendo 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)))))

(Es probable que tenga que buscar la definición de do si realmente desea utilizar este.)

Se puede notar que eso es bastante feo. Eso es porque en realidad nadie lo hace de esta manera. En su lugar, usted tiene que darse cuenta de que llamar a una función crea una nueva variable también. Prueba esto:

(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 está familiarizado con los algoritmos, se dará cuenta de que el código que acabo de escribir es bastante lento, pero ilustra el punto: en cada caso, lo hace un poco de trabajo y después de llamar a su función de nuevo. Si usted está teniendo problemas para el ver por qué esto funciona, ejecute esta función en lugar de su ejemplo:

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

Aquí hay alguna elisp simplista:

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

Este se comporta igual que el incorporado en la intersección de estas pruebas sencillas:

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

Es mejor usar operaciones de conjuntos de SrfI-1.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top