将元素添加到Scheme中的列表

时间:2010-03-29 23:11:14

标签: list lisp scheme

我正在使用R5RS Scheme,我只想实现一个返回两个给定列表交集的函数,但我不能这样做,因为我无法将一个元素添加到列表中。这是我的代码。我该如何解决?我真的是Scheme的初学者 - 这是我第一次使用Scheme。

事先提前......

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

4 个答案:

答案 0 :(得分:1)

这是一个递归版本,它执行交集而不是联合。

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

答案 1 :(得分:0)

这是一些简单的elisp:

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

这与这些简单测试的内置交集相同:

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

答案 2 :(得分:0)

我想我看到了你的问题。有两种方法可以将元素添加到列表中。

第一种方式是实际添加它:

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

(如果你真的想使用它,你可能需要查找do的定义。)

你可能会注意到这很难看。那是因为没有人真正这样做。相反,您必须意识到调用函数也会创建一个新变量。试试这个:

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

如果你熟悉算法,你会注意到我刚写的代码很慢,但它说明了一点:在每种情况下,你做了一些工作,然后再次调用你的函数。如果您无法理解为什么会这样,请在您的示例中运行此函数:

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

答案 3 :(得分:0)

最好使用srfi-1中的set operations