如何在Haskell中递归比较数字中的数字
我正在对Project Euler进行测试,并提出了以下方法来测试示例案例(我将把如何在Haskell中递归比较数字中的数字,haskell,recursion,Haskell,Recursion,我正在对Project Euler进行测试,并提出了以下方法来测试示例案例(我将把answer中的数字改为0.99以获得真正的答案): 如果您有整数的字符串表示形式,则可以这样编写isIncre函数(ord将字符转换为整数,字符串只是字符列表): 数字0.99不能在基数2中精确表示。因此,您可能希望避免在此赋值中使用浮点数。相反,如果您有intetger的字符串表示形式,那么为了查看是否有99%的数字,我会使用非常好的isIncre函数版本 isIncre :: (Ord a) => [a
answer
中的数字改为0.99以获得真正的答案):
如果您有整数的字符串表示形式,则可以这样编写isIncre函数(ord将字符转换为整数,字符串只是字符列表):
,我会使用非常好的isIncre函数版本
isIncre :: (Ord a) => [a] -> Bool
isIncre list = and $ zipWith (<=) list (tail list)
接得好。对我来说,“100*bouncers x==99*x”更具可读性。不过只是口味的问题。我不明白你的计算公式在99%的情况下是如何工作的。我补充了一些解释。让我知道是否清楚。谢谢你。我只需要重写最后两行。因为Char
是Ord
的一个实例,而且由于数字在ASCII表中有其自然顺序,所以在这种情况下,不需要调用Ord
。我尝试使用第二个函数作为isIncre'
,但它不喜欢=
。编辑问题以重申Jonno:只要替换所有的isIncre
@Stephan202,你是对的。我是从内存中执行此操作的,不记得Char是否为Ord。好的,编译后,用了0.5秒的时间计算示例大小写%50为538,但现在需要花费很长时间才能达到%99。是否有我忽略的优化?
isIncre x | x <= 99 = False
| otherwise = isIncre' (mshow x)
where
isIncre' (x:y:xs) = (x <= y) && (isIncre' (y:xs))
isIncre' _ = True
isIncre (x:y:xs) = ord x <= ord y && isIncre (y:xs)
isIncre _ = True
isIncre (x:y:xs) = x <= y && isIncre (y:xs)
isIncre _ = True
isIncre (map ord (show x))
100 * (x - bouncers x) == x
bouncers x = length $ filter isBouncy [1..x]
isIncre :: (Ord a) => [a] -> Bool
isIncre list = and $ zipWith (<=) list (tail list)
isIncreNum :: Integer -> Bool
isIncreNum = isIncre . show