题
我使用R5RS方案,我只是想实现一个函数,返回给定的两个列表的交集,但我不能这样做,因为我无法将元素添加到列表中。这里是我的代码。我怎样才能解决这个问题?我真的在计划初学者 - 这是我使用计划的第一部作品
Thx提前..
(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))
解决方案
下面是确实的交点代替联合的递归版本。
(define (intersect list1 list2)
(cond ((null? list1) list1)
((member (car list1) list2) (cons (car list1) (intersect (cdr list1) list2)))
(t (intersect (cdr list1) list2))))
其他提示
我想我看到你的问题。有两种方法将元素添加到列表中。
第一种方法将被实际添加的:
(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)))))
下面是一些简单的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)
您最好使用组操作从的SRFI-1。
不隶属于 StackOverflow