问题描述
我一直在处理一项任务,但我无法让它发挥作用。
我应该编写一个函数,它接受一个数字列表并返回一个显示偶数但将所有奇数加倍的列表。 (基本上相同的列表,但赔率翻了一番)。
doubleOdd :: [Integer] -> [Integer]
doubleOdd [] = []
doubleOdd a = [x*2 | x <- a,odd x]
我的问题是:
- 我只允许使用 +、-、*、/、==、/=、sum、mod、elem、maximum、odd、even
- 我不知道如何获得相同值的不同条件(例如,如果 x 是偶数 = x 并且在同一个列表理解中:如果 x 是奇数 = x*2)
到目前为止我只打印偶数或奇数,但从来没有同时打印.....
希望有人能帮助我。
解决方法
在递归情况下,用两个互斥的测试处理两种可能的情况,赔率的情况和偶数的情况:
doubleOdd a = [ .... | x <- a,y <- ([x*2 | .... x] ++ [x | .... x]) ]
由于两个测试是互斥的,所以只有一个结果。
您必须使用 ++
或 if...then...else
。我认为没有一种方法可以做到这一点。
或者也许可以通过一些算术技巧来完成,但那将是一个数学问题,而不是 Haskell 问题。
,如果您正在寻找数学技巧版本:
> take 10 $ [ x + (x `mod` 2) * x | x <- [1..] ]
[2,2,6,4,10,14,8,18,10]
(你可以用mod
做很多这样的作弊)