如何修复我的代码以适用于所有测试?
How can I fix my code to work for all of the tests?
Decide whether the items in the list all give the same remainder divided by two.
我的代码在 mod 为 1 时有效,但在 mod 为 0 时无效。我必须添加什么才能工作? if - else 语句或其他语句?
sameParity :: [Int] -> Bool
sameParity [] = True
sameParity (x: xs)
| x `mod` 2 == 1 = sameParity xs
| x `mod` 2 == 0 = sameParity xs
| otherwise = False
示例:
以下每个测试用例都必须给出 True:
sameParity[] == True
sameParity [1..10] == False
sameParity [1,3..10] == True
sameParity [2, 42, 0, 8] == True
sameParity (1: [2, 42, 0, 8]) == 假
在每一步,你必须检查其余元素的奇偶校验是否与所有前面元素相同.问题是,在每一步你都不再知道前面的所有元素。他们现在迷路了。
所以你要做的就是将前面所有元素的奇偶性作为参数传递给下一步:
allHaveParity [] _ = True
allHaveParity (x:xs) prevItemsParity = (x `mod` 2 == prevItemsParity) && (allHaveParity xs prevItemsParity)
> allHaveParity [1,3] 1
True
> allHaveParity [2,4] 0
True
> allHaveParity [1,2] 1
False
但是,当然,这现在非常不方便,因为现在您必须传入“预期的”奇偶校验,而不是让函数自行计算出来。
但不要害怕!只需将此函数包装在另一个函数中,它将获取第一项的奇偶校验并将其传递下去:
sameParity [] = True
sameParity (x:xs) = allHaveParity xs (x `mod` 2)
现在可以很容易地观察到,一旦我们有了第一个项目的奇偶校验,我们就可以使用 the existing all
function 来检查所有其他项目:
sameParity [] = True
sameParity (x:xs) =
let firstParity = x `mod` 2
in all (\a -> (a `mod` 2) == firstParity) xs
并丢弃 allHaveParity
函数。它在做同样的事情,但使用显式递归。
Decide whether the items in the list all give the same remainder divided by two.
我的代码在 mod 为 1 时有效,但在 mod 为 0 时无效。我必须添加什么才能工作? if - else 语句或其他语句?
sameParity :: [Int] -> Bool
sameParity [] = True
sameParity (x: xs)
| x `mod` 2 == 1 = sameParity xs
| x `mod` 2 == 0 = sameParity xs
| otherwise = False
示例:
以下每个测试用例都必须给出 True:
sameParity[] == True
sameParity [1..10] == False
sameParity [1,3..10] == True
sameParity [2, 42, 0, 8] == True
sameParity (1: [2, 42, 0, 8]) == 假
在每一步,你必须检查其余元素的奇偶校验是否与所有前面元素相同.问题是,在每一步你都不再知道前面的所有元素。他们现在迷路了。
所以你要做的就是将前面所有元素的奇偶性作为参数传递给下一步:
allHaveParity [] _ = True
allHaveParity (x:xs) prevItemsParity = (x `mod` 2 == prevItemsParity) && (allHaveParity xs prevItemsParity)
> allHaveParity [1,3] 1
True
> allHaveParity [2,4] 0
True
> allHaveParity [1,2] 1
False
但是,当然,这现在非常不方便,因为现在您必须传入“预期的”奇偶校验,而不是让函数自行计算出来。
但不要害怕!只需将此函数包装在另一个函数中,它将获取第一项的奇偶校验并将其传递下去:
sameParity [] = True
sameParity (x:xs) = allHaveParity xs (x `mod` 2)
现在可以很容易地观察到,一旦我们有了第一个项目的奇偶校验,我们就可以使用 the existing all
function 来检查所有其他项目:
sameParity [] = True
sameParity (x:xs) =
let firstParity = x `mod` 2
in all (\a -> (a `mod` 2) == firstParity) xs
并丢弃 allHaveParity
函数。它在做同样的事情,但使用显式递归。