【发布时间】:2014-10-16 14:28:35
【问题描述】:
我正在通过learnyouahaskell学习haskell,做haskellwiki的99个问题,以及project euler问题。昨天我花了大部分时间在PE problem 3 上工作,但没有成功,因为我的所有解决方案都会运行很长时间并且让我的电脑陷入困境。我通读了haskell wiki page on prime numbers,但仍然没有成功,所以我放弃并查看了here 发布的解决方案。
代码如下:
primes = 2 : filter ((==1) . length . primeFactors) [3,5..]
primeFactors n = factor n primes
where
factor n (p:ps)
| p*p > n = [n]
| n `mod` p == 0 = p : factor (n `div` p) (p:ps)
| otherwise = factor n ps
它的速度很快,它会立即给出答案,但我无法完全理解这段代码。特别是primes 函数和过滤器发生了什么,以及它如何与primes 调用primeFactors 和primeFactors 调用primes 一起工作。如果我在 GHCI 中运行 primes,它会创建一个无限的素数列表,我不知道为什么。
【问题讨论】:
-
这段代码也可以简单地改进。测试主要因子列表的长度并不足以跳过生成其余因子(如果它是复合因子)。
-
嗯,它的工作原理是根据已知素数列表检查每个新的潜在素数,这比检查每个数字更不浪费。
primes是一个无限列表,它从2开始,然后通过检查列表[3,5..]与当前“可用”列表继续进行。这有帮助吗? -
一个更简单的例子可能是斐波那契数列:
fib = 1 : 1 : zipWith (+) fib (tail fib)。fib可以在开始引用zipWith正在生成的项目之前获取1 : 1 :。tail fib可以得到1 :。由于每个都有一个,它可以生成序列中的下一个项目,并开始使用它...... -
@JakeSellers 小例子:
ones = 1 : ones或naturals = 0 : map (+1) naturals或fibs = 0 : 1 : zipWith (+) fibs (tail fibs)。
标签: algorithm haskell math primes prime-factoring