测试一个列表是否包含在另一个列表中

时间:2014-05-24 04:09:14

标签: scheme

我想创建一个比较两个列表的函数,让我知道一个是否包含在另一个列表中,最后我列出了一个真或假的列表 例子

(define L1 (list 2 4 5))
(define L2 (list 3 6 5 8 2))

(define (contain? L1 L2))


>(list true false true)


(define (contain? L1 L2)


 (cond
 [(or (empty? L1)(empty? L2)) false]
[else 
(cond 
 [(= (first L1) (first L2)) true]
[else (contain? (rest L1) (rest L2))])]))

(buscar (list 4 6) (list 1 2 4 6))

尝试这样做,但它告诉我是假的

2 个答案:

答案 0 :(得分:1)

首先关闭。 cond的作用为if,但可以使用多个术语。在elseif的其他语言中,您的代码可以写成:

(define (contain? L1 L2)  
  (cond
    [(or (empty? L1)(empty? L2)) false]     ; why should (contain? '() '()) ==> false?
    [(= (first L1) (first L2)) true]        ; stops here with one true value as result for the whole thing.
    [else (contain? (rest L1) (rest L2))])) ; recurses without makeing a pair that has a false-value and the recursion as it's tail

如果您在两个列表中的相同位置找到相同的数字,则评估为true。否则,它将评估为false

如果您想要一个包含truefalse的列表,则需要在两个位置使用(cons this-result (recurse-rest)),因为其中一个列表为empty?。当empty?您需要使用空列表终止列表时。

IE中。 (contain? '(1 2 3) '(3 2 1 0)) (contain (cons 1 (cons 2 (cons 3 '()))) (cons 3 (cons 2 (cons 1 '())))程序需要一次完成每对(缺点),以便第一次迭代为(cons false recursion-result),第二次迭代变为(cons true recursion-result)和第四次迭代迭代第一个列表是empty?,因此它的计算结果为'()

如果您在第二个列表中的任何位置找到第一个列表中的当前元素,那么您在开头的示例似乎认为您应该能够创建一个真值。为此,您需要迭代第一个列表,并在第二个列表中使用member搜索它。例如。在第一次迭代中使用全局L1和L2表达式来检查你是否拥有它不能(eq? (first l1) (first l2))而是(memq (first L1) L2)

答案 1 :(得分:0)

您需要将问题分为两部分:

(define (contain-one? e lst)
  ; is element e contained in lst?
  (cond
    [(empty? lst) false]
    [(= e (first lst)) true]
    [else (contain-one? e (rest lst))]))

然后

> (contain-one? 2 (list 3 6 5 8 2))
true
> (contain-one? 4 (list 3 6 5 8 2))
false
> (contain-one? 5 (list 3 6 5 8 2))
true

第二步,将此功能与map

一起使用
(define (contain? lst1 lst2)
  (map (lambda (e) (contain-one? e lst2)) lst1))

然后

> (contain? (list 2 4 5) (list 3 6 5 8 2))
'(true false true)