一种求质数的简易方法

想法 质数的定义我还记得,是小学数学教的,“一个大于1的整数,除了1和它本身,不能被其它任何数整除,就叫做质数”。
求小于等于 x 的所有质数,可以采用递归方法,设 f(x) 为小于等于 x 的所有质数。那么 f(2) = [2], 当 x > 2, f(x-1) 为小于 x 的所有质数。根据质数的定义,如果 f(x-1)结果中全部的质数都不能整除 x,则 x 是质数,否则不是。
代码 【一种求质数的简易方法】由于采用了递归算法,直接实现可能会产生大量重复计算,所以我们稍微修改了一下,使用了一个map作为缓存,并且从小到大进行计算,因为大的数会用到小的数的结果。

defmodule Prime dodef primes(x) when x >= 2 do primes(x, %{2 => [2]}, 3) enddefp 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) enddefp 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

测试一下
一种求质数的简易方法
文章图片

    推荐阅读