我从代码中得到了错误的结果。
我想检查第一个参数列表中的元素是否出现在第二个参数列表中,并且我使用了此停顿Check, if list is a sublist of another list中的代码,但没有得到想要的结果。
del :: Eq t => [t] -> [t] -> Bool
del [] [] = True
del _ [] = False
del [] _ = True
del (x:xs) (y:ys)
| x == y = del xs ys
| otherwise = del (x:xs) ys
del [2,3] [3,3,1] -- should return False, which it does, but
del "cbbbc" "bca" -- should return True, but instead it returns False
我不明白为什么?
答案 0 :(得分:3)
"cbbbc"
不是"bca"
的子列表,这意味着列表"cbbbc"
不会像"bca"
那样出现在"ca"
内部。您的问题是另一个问题。这是一个工作代码,时间复杂度为O(n):
del :: Eq a => [a] -> [a] -> Bool
del xs ys = all (`elem` ys) xs
这意味着:如果(且仅当),对于True
中的每个x
,xs
是x
的元素,返回ys
。
答案 1 :(得分:2)
您即将移除y
;仅仅因为x /= y
并不意味着x == z
对于z
中的某些其他值ys
不会成立。如果您不需要在 all 处删除elem
,则使用y
实施起来会容易得多。如果这样做,找到匹配项时,您将需要做更多的工作才能从ys
中删除正确的元素。 (例如,del [1, 1] [1]
应该返回True还是False,因为1
在第二个列表中不会出现两次?)