我想创建一个比较两个列表的函数,让我知道一个是否包含在另一个列表中,最后我列出了一个真或假的列表 例子
(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))
尝试这样做,但它告诉我是假的
答案 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
。
如果您想要一个包含true
和false
的列表,则需要在两个位置使用(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)