【发布时间】:2019-04-29 19:12:18
【问题描述】:
我正在尝试生成可以用 形式表示的所有倍数的列表,其中 a、b 和 c 是整数。我尝试了以下,
[ a * b * c | a <- map (2^) [0..], b <- map (3^) [0..], c <- map (5^) [0..] ]
但它只列出了 5 的幂,从不继续 2 或 3。
编辑:抱歉,我似乎没有充分澄清这个问题。我想要的是一个有序的无限列表,虽然我可以对一个有限列表进行排序,但我觉得好像有一个更有效的解决方案。
【问题讨论】:
-
您的解决方案满足您提出的要求。也许您可以更仔细地说明问题?例如听起来您希望列表按特定顺序排列
-
有没有比my solution更好的非笨方法?
-
@melpomene 是的,有。您的解决方案会产生过多的序列,总是在其中添加三个倍数,同时选择一个。您可以有条件地只添加最小的一个,实际上将三个反向指针保留到正在生成的有序序列中。著名的规范代码可以在维基百科上的标签(我添加的)RosettaCode page 和 "Haskell Features" page 上找到。
-
@melpomene /contd./ 然后有一个new, twice faster 代码,每个数字只产生一次。 (也出现在上面链接的 RosettaCode 和 WP 页面上)。
-
@WillNess 好的,如果您认为它值得,我会保留它。
标签: haskell hamming-numbers smooth-numbers