我使用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。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top