1

想法

质数的定义我还记得,是小学数学教的,“一个大于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

测试一下

image.png


Ljzn
399 声望102 粉丝

网络安全;函数式编程;数字货币;人工智能