首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Haskell中递归比较数字中的数字

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

Stack Overflow用户
提问于 2009-11-23 23:03:26
回答 3查看 648关注 0票数 2

我正在对Project Euler执行problem 112,并提出了以下内容来测试示例用例(我将answer中的数字更改为0.99以获得真正的答案):

代码语言:javascript
复制
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更改为时,它不喜欢=

代码语言:javascript
复制
isIncre  x | x <= 99 = False
           | otherwise = isIncre' (mshow x)
                        where
                            isIncre' (x:y:xs) = (x <= y) && (isIncre' (y:xs))
                            isIncre' _ = True
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-11-23 23:17:39

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

代码语言:javascript
复制
isIncre (x:y:xs) = ord x <= ord y && isIncre (y:xs)
isIncre _ = True

如果编写不带ordered函数,处理任何有序类型,然后在调用它时将其与"map ordered“组合在一起,可能会更好。然后,实现就是:

代码语言:javascript
复制
isIncre (x:y:xs) = x <= y && isIncre (y:xs)
isIncre _ = True

如果x是一个整数,则可以这样调用

代码语言:javascript
复制
isIncre (map ord (show x))
票数 2
EN

Stack Overflow用户

发布于 2009-11-23 23:25:11

  1. 数字0.99不能以2为基数精确表示。因此,您可能希望避免在此赋值中使用浮点数。相反,要查看数字<= x中是否有99%是保镖,请测试

100 * (x -保镖x) == x

这是可行的,因为它(在数学上)与(x - bouncers x) == x / 100相同,如果(x - bouncers x) (非跳跃数字的数量)是x的1%,则是真的。注意,因此不需要定义nonBouncers.

  • Also,。定义bouncers的另一种方法是

bouncers x= length $ filter 1..x

  • However,isBouncy你应该重新考虑你的设计。当前,对于您尝试的每个x,您正在重新计算最高可达x的弹跳数。因此,大量的工作被一遍又一遍地完成。相反,您可能想要做的是生成一个元组序列(x, n),其中n是反弹数<= x的数量。注意到,如果存在n反弹数<= x,则存在nn + 1反弹数<= x + 1

更具体地说,要计算(x + 1, n'),只需要(x, n)isbouncy (x + 1).的输出

票数 3
EN

Stack Overflow用户

发布于 2009-11-24 01:30:04

如果你有intetger的字符串表示,我会使用非常好的isIncre函数版本。

代码语言:javascript
复制
isIncre :: (Ord a) => [a] -> Bool
isIncre list = and $ zipWith (<=) list (tail list)

如果不是,就用show编写它。

代码语言:javascript
复制
isIncreNum :: Integer -> Bool
isIncreNum = isIncre . show
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1783668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档