想法
质数的定义我还记得,是小学数学教的,“一个大于1的整数,除了1和它本身,不能被其它任何数整除,就叫做质数”。
求小于等于 x 的所有质数,可以采用递归方法,设 f(x) 为小于等于 x 的所有质数。那么 f(2) = [2]
, 当 x > 2, f(x-1) 为小于 x 的所有质数。根据质数的定义,如果 f(x-1)结果中全部的质数都不能整除 x,则 x 是质数,否则不是。
代码
由于采用了递归算法,直接实现可能会产生大量重复计算,所以我们稍微修改了一下,使用了一个map作为缓存,并且从小到大进行计算,因为大的数会用到小的数的结果。
defmodule Prime do
def primes(x) when x >= 2 do
primes(x, %{2 => [2]}, 3)
end
defp primes(x, m, n) when n > x, do: m[x]
defp primes(x, m, n) do
m = case m[n] do
nil -> Map.put(m ,n, do_primes(m, n))
_ -> m
end
primes(x, m, n+1)
end
defp do_primes(m, n) do
if Enum.all?(m[n-1], fn x -> rem(n, x) != 0 end) do
[n | m[n-1]]
else
m[n-1]
end
end
end
测试一下
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。