我正试图生成形如2^m*3^n*5^l的数字,其中m、n和l是自然数(包括0)。
该序列如下:1、2、3、4、5、6、8、9、10、12、15、16、18、20、24、25、27、30、32、......
我正在测试获取第一百万个数字。我使用列表推导和排序进行实现,但是它太慢了。我想要一个更快的解决方案。我已经花了几天时间尝试做这件事,但无济于事。
我不需要完整的解决方案。我只想知道Haskell概念在完成此任务时是必要的。
我正试图生成形如2^m*3^n*5^l的数字,其中m、n和l是自然数(包括0)。
该序列如下:1、2、3、4、5、6、8、9、10、12、15、16、18、20、24、25、27、30、32、......
我正在测试获取第一百万个数字。我使用列表推导和排序进行实现,但是它太慢了。我想要一个更快的解决方案。我已经花了几天时间尝试做这件事,但无济于事。
我不需要完整的解决方案。我只想知道Haskell概念在完成此任务时是必要的。
~N^(2/3)
。将数字乘以5是指其数量级——完全不同的东西。这意味着最好情况下需要N log N时间。Dijkstra算法及其等效算法的时间是线性的,因为它不会过度生成,其内部队列指向后方并且具有恒定的3个元素大小。 - Will NessInt -> Bool
的函数,确定给定整数是否在您定义的序列中。它将尽可能多地将数字除以2(不创建分数),然后尽可能多地将其除以3,最后尽可能多地将其除以5。在所有这些操作之后,如果数字大于1,则无法表示为二、三和五的乘积,因此函数将返回false。否则,该数字在您的序列中,因此函数返回true。通过在删除最小元素x时插入较少的元素,可以改进Carl的方法:如2<3<4<5<6,您只需
代码如下:
g2 x | mod x 4 == 0 = [5*div x 4]
| even x = [3*div x 2]
| otherwise = []
g3 x | mod x 3 == 0 = [4*div x 3]
| otherwise = []
g5 x | mod x 5 == 0 = [6*div x 5]
| otherwise = []
g x = concatMap ($ x) [g2, g3, g5]
m
、n
和l
作为参数输入并返回数字,还是需要更复杂的东西?你是否尝试高效地生成符合该形式的所有数字序列,并希望它们按递增顺序排列? - David Grayson