我的计算机科学课上的两个问题需要帮助。问题如下。
编写一个包含所有的函数?它使用两个数字列表,如果第一个列表包含第二个列表的所有元素,则返回 true,否则返回 false。为了简单起见,假设两个列表都不会多次包含相同的元素。
编写一个函数 common-elements,它接受两个数字列表并返回两个列表中出现的所有元素的列表。
对于第 1 点,到目前为止我有以下代码:
(define (contains-all? lon lon2)
(cond
[(and (empty? lon) (empty? lon2)) true]
[(or (empty? lon) (empty? lon2)) false
[(equal? (first lon) (first lon2)) (contains-all? (rest lon) (rest lon2))]
[else false]))
我的检查预期如下:
(check-expect (contains-all? empty empty) true)
(check-expect (contains-all? empty (list 1 2 3)) false)
(check-expect (contains-all? (list 1 2 3) empty) false)
(check-expect (contains-all? (list 1 2 3) (list 3 2 1)) true)
(check-expect (contains-all? (list 1 2 4 6 8) (list 6 8 4)) true)
(check-expect (contains-all? (list 1 2 8 6) (list 1 2 6 4)) false)
我知道一些检查预期会失败,这就是我需要帮助的地方。
对于问题 2,我到目前为止已经有了这个
(define (common-elements lon lon2)
(cond
[(and (empty? lon) (empty? lon2)) empty]
[(or (empty? lon) (empty? lon2)) empty]
[(equal? (first lon) (first lon2))
(cons (first lon) (common-elements (rest lon) (rest lon2)))]
[(not (equal? (first lon) (first lon2))) (common-elements (first lon) (first lon2))]
;[else (common-elements (first lon) (rest lon2))]))
检查预期如下:
(check-expect (common-elements empty empty) empty)
(check-expect (common-elements empty (list 1 2)) empty)
(check-expect (common-elements (list 1 2) empty) empty)
(check-expect (common-elements (list 1 2 3) (list 1 2 4)) (list 1 2))
(check-expect (common-elements (list 3 2 1) (list 2 1)) (list 2 1))
我对 2 号也有同样的问题,需要帮助。
正如@uselpa 指出的那样,很大程度上取决于列表中的数字是否保证排序。您的问题陈述表明否,但您的代码表明是。你有这个保证吗?我猜答案是否定的。
下一步:您认为这是一个需要生成递归的问题,但事实似乎并非如此。具体来说,这两个函数看起来都像是 HtDP 同时处理两个列表的简单实例:案例 1。
如果你的老师声称这些需要生成递归,我认为你的老师错了:)。
但是,我可以说,如果您在构建主函数时使用“愿望清单”方法来描述所需的函数,那么这两个问题都会变得容易得多。
此外,正如 @Renzo 指出的那样,您似乎至少在一个测试用例中存在错误;包含 1,2 和 3 的列表当然包含空列表中的所有元素。