我正在使用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))
答案 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。