我正在对Project Euler执行problem 112,并提出了以下内容来测试示例用例(我将answer中的数字更改为0.99以获得真正的答案):
isIncre x | x == 99 = False
| otherwise = isIncre' x
where
isIncre' x = ???
isDecre x = isIncre (read $ reverse $ show x :: Int)
isBouncy x = (isIncre x == False) && (isDecre x == False)
bouncers x = length [n|n<-[1..x],isBouncy n]
nonBouncers x = length [n|n<-[1..x],(isBouncy n) == False]
answer = head [x|x<-[1..],((bouncers x) / (nonBouncers x)) == 0.5]但我不知道怎么做的是定义一个函数isIncre',它测试一个数字中的数字是否大于或等于它们左边的数字。我知道它需要递归地完成,但是怎样做呢?
顺便说一句,我知道我只能对两个浮点数使用/,但是我如何才能使bouncers的输出成为浮点数而不是整数呢?
编辑:
谢谢你的帮助,但当我将isIncre更改为时,它不喜欢=:
isIncre x | x <= 99 = False
| otherwise = isIncre' (mshow x)
where
isIncre' (x:y:xs) = (x <= y) && (isIncre' (y:xs))
isIncre' _ = True发布于 2009-11-23 23:17:39
如果您有一个整数的字符串表示,您可以像这样编写isIncre函数(ord将字符转换为整数,string只是一个字符列表):
isIncre (x:y:xs) = ord x <= ord y && isIncre (y:xs)
isIncre _ = True如果编写不带ordered函数,处理任何有序类型,然后在调用它时将其与"map ordered“组合在一起,可能会更好。然后,实现就是:
isIncre (x:y:xs) = x <= y && isIncre (y:xs)
isIncre _ = True如果x是一个整数,则可以这样调用
isIncre (map ord (show x))发布于 2009-11-23 23:25:11
<= x中是否有99%是保镖,请测试100 * (x -保镖x) == x
这是可行的,因为它(在数学上)与(x - bouncers x) == x / 100相同,如果(x - bouncers x) (非跳跃数字的数量)是x的1%,则是真的。注意,因此不需要定义nonBouncers.
bouncers的另一种方法是bouncers x= length $ filter 1..x
x,您正在重新计算最高可达x的弹跳数。因此,大量的工作被一遍又一遍地完成。相反,您可能想要做的是生成一个元组序列(x, n),其中n是反弹数<= x的数量。注意到,如果存在n反弹数<= x,则存在n或n + 1反弹数<= x + 1。更具体地说,要计算(x + 1, n'),只需要(x, n)和isbouncy (x + 1).的输出
发布于 2009-11-24 01:30:04
如果你有intetger的字符串表示,我会使用非常好的isIncre函数版本。
isIncre :: (Ord a) => [a] -> Bool
isIncre list = and $ zipWith (<=) list (tail list)如果不是,就用show编写它。
isIncreNum :: Integer -> Bool
isIncreNum = isIncre . showhttps://stackoverflow.com/questions/1783668
复制相似问题