【发布时间】:2021-12-04 21:35:02
【问题描述】:
实现
isLengthEven :: [a] -> Bool函数,该函数决定列表是否包含偶数个元素。在本练习中,禁止使用length函数或任何其他返回列表元素数量的函数。提示:我们只需要检查我们是否可以两个两个遍历整个列表,或者函数是否在最后遗漏了一个项目。
例如:
isLengthEven "Apple" == True、isLengthEven "Even" == True、isLengthEven [] == False
到目前为止,我尝试了模式匹配和递归,我认为这是进行此练习的最佳方式。我的代码如下:
isLengthEven :: [a] -> Bool
isLengthEven [] = False
isLengthEven (x:[]) = False
isLengthEven (x:(y:[])) = True
isLengthEven (x:(y:(z:[]))) = False
isLengthEven (x:(y:(z:(q:[])))) = True
isLengthEven (x:xs) = isLengthEven (xs)
这会返回正确的值,直到我将第五个元素插入到列表中。对于大于或等于 5 的任意数量的元素,它会返回 True。我想递归部分有问题。
【问题讨论】:
-
您的递归案例是错误的。而且您几乎不需要那么多基本案例。
-
另外,您的基本情况之一是错误的。
-
你做了太多的基本情况,
[]应该映射到True,而不是False,因为空列表的长度为0,这是偶数。 -
@AWheelbarrow:
(x:(y:[]))、(x:(y:(z:[])))和(x:(y:(z:(q:[]))))不是必需的。 -
模式
(x:(y:(z:(q:[]))))与模式[x,y,z,q]相同,就像值一样。