如何在Haskell中递归比较数字中的数字

如何在Haskell中递归比较数字中的数字,haskell,recursion,Haskell,Recursion,我正在对Project Euler进行测试,并提出了以下方法来测试示例案例(我将把answer中的数字改为0.99以获得真正的答案): 如果您有整数的字符串表示形式,则可以这样编写isIncre函数(ord将字符转换为整数,字符串只是字符列表): 数字0.99不能在基数2中精确表示。因此,您可能希望避免在此赋值中使用浮点数。相反,如果您有intetger的字符串表示形式,那么为了查看是否有99%的数字,我会使用非常好的isIncre函数版本 isIncre :: (Ord a) => [a

我正在对Project Euler进行测试,并提出了以下方法来测试示例案例(我将把
answer
中的数字改为0.99以获得真正的答案):


如果您有整数的字符串表示形式,则可以这样编写isIncre函数(ord将字符转换为整数,字符串只是字符列表):


  • 数字0.99不能在基数2中精确表示。因此,您可能希望避免在此赋值中使用浮点数。相反,如果您有intetger的字符串表示形式,那么为了查看是否有99%的数字
    ,我会使用非常好的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