1

如果它们中的任何内容相同,是否可以相互检查两个列表?

(清单'(嘿饼干猴子)'(苹果披萨饼干)==> #t

我尝试了类似的东西

(define (check-list list element)
  (let ((x list))
  (cond ((null? x) #f)
        ((eq? (car x) (car element)) #t)
        (else (check-list (cdr x) element))))
  (check-list list (cdr element)))

我知道这写得不正确,但不知道如何解决这个问题。

任何人都可以帮助我吗?

4

7 回答 7

1

类似于先前的答案,但利用了逻辑原语:

(define (intersect? list1 list2)
  (and (not (null? list1))
       (or (member     (car list1) list2)
           (intersect? (cdr list1) list2))))
于 2013-05-22T14:17:12.520 回答
1

如果列表很长,您可能想要散列第一个列表,然后遍历第二个列表。这将 R5RS 与 srfi-69 一起使用,对于小型列表,您会得到一些开销,但

(require srfi/69); alist->hash-table, hash-table-ref/default 
(define (intersect? list1 list2)
  (let ((hash (alist->hash-table (map (lambda (x) (cons x x)) list2) equal? )))
    (let loop ((list list1))
      (and (not (null? list))
           (or (hash-table-ref/default hash (car list) #f)
               (loop (cdr list)))))))
于 2013-05-28T21:42:36.577 回答
1

有时它有助于用自然语言制定解决问题的过程。让我们稍微简化一下问题。

如何检查一个元素是否包含在列表中?做到这一点的一种方法是将一个元素与列表中的每个元素进行比较,直到找到它 - 沿着你已经完成的路线的某个地方 - 但不完全。快速草稿将是:

(define (member? e lst)
  (cond ((null? lst) #f)       ; empty list doesn't contain e
        (or (eq? e <??>)       ; either the first element is e or
            (member? e <??>))) ; the rest of the list contains e

我们可以利用以前的知识来解决手头的实际问题。我们知道如何在列表中搜索一个元素,现在我们需要在另一个列表中搜索列表中的每个元素。

(define (check-list lst1 lst2)
  (if (or (null? lst1) (null? lst2)) #f  ; empty list(s) share no elements
      (or (member? <??> <??>)            ; first element of lst1 in lst2?
          (member? <??> <??>))))         ; rest of lst1 in lst2?

<??>应该用适当的表达式替换以选择列表的各个部分。

于 2013-05-22T13:37:51.127 回答
0

这是使用高阶函数的答案

在 mit-schme

(define (check-list L1 L2)
 (apply boolean/or (map (lambda (x) (member? x L2)) L1)))
于 2013-05-22T23:19:46.933 回答
0

似乎有些混乱。这里的“大”问题是如何确定两个列表是否共享至少一个共同元素,让我们为此编写一个名为element-in-common?. 在解决这个问题之前,我们需要确定一个元素是否属于一个列表,这是check-list应该做的(注意在你的代码中接收一个元素check-list作为第二个参数,但是你把它当作一个元素列表来对待)。

您不必编写check-list程序,它已经存在并且被称为member. 有了这些知识,我们就可以解决大问题了——如何确定一个列表(我们称之为)中的至少一个元素lst1是否在另一个列表(称为lst2)中?

很简单:我们使用递归遍历每个元素lst1,询问每个元素是否属于lst2. 如果只有一个元素 oflst1是 的成员lst2,我们返回#t。如果 in 中没有任何元素,lst1lst2返回#f。像这样的东西:

(define (element-in-common? lst1 lst2)
  (cond (<???>               ; is the first list empty?
         <???>)              ; then there are no elements in common
        ((member <???> lst2) ; is the current element of `lst1` in `lst2`?
         <???>)              ; then there IS an element in common
        (else                ; otherwise
         (element-in-common? <???> lst2)))) ; advance recursion

不要忘记测试您的代码:

(element-in-common? '(hey cookie monkey) '(apple pizza cookie))
=> #t

(element-in-common? '(hey cookie monkey) '(apple pizza pie))
=> #f
于 2013-05-22T14:05:45.080 回答
0

您可以使用memq检查第一个列表中的第一个元素是否在第二个列表中,如果不是,则递归检查第一个列表的其余部分是否在第二个列表中:

(define (check-list list1 list2)
  (cond ((null? list1) #f)
        ((memq (car list1) list2) #t)
        (else (check-list (cdr list1) list2))))
于 2013-05-22T13:36:58.570 回答
0
(define remove-item
  (lambda (lst ele)
    (if (null? lst)
        '()
        (if (equal? (car lst) ele)
            (remove-item (cdr lst) ele)
            (cons (car lst)
                  (remove-item (cdr lst) ele))))))
于 2020-03-11T04:26:52.313 回答