【问题标题】:SML Sieve of EratosthenesSML 埃拉托色尼筛
【发布时间】:2022-01-14 22:25:51
【问题描述】:

我是 SML 的新手。我正在尝试创建一个函数,该函数使用埃拉托色尼筛法输出小于或等于给定整数 n > 2 的所有素数的列表。我遇到了一个问题,但是输出仅显示为 [1]。我希望能够输入诸如 5 并得到 [1,3,5] 的结果。

这是我目前的代码,我很新,所以我知道它很可能写得不正确。

fun createList(ending) =
  let 
    fun createListX(start, ending) =
      if start = ending then []
      else start :: createListX(start + 1, ending)
  in
    createListX(1, ending + 1)
  end;

fun removeMult ([], n) = []
  | removeMult (x::xs, n) = 
      if x mod n = 0 then 
        removeMult(xs, n)
      else 
        x :: removeMult(xs, n);

fun sieve([], primes) = primes
  | sieve(n::ns, primes) = sieve(removeMult(ns, n), n :: primes);

fun dosieve(n) = sieve(createList(n-1), []);

【问题讨论】:

    标签: function primes sml smlnj sieve-of-eratosthenes


    【解决方案1】:

    您的removeMult 函数运行良好。

    您的sieve 函数也可以完美运行。 完美了。

    考虑一下当你调用dosieve(10) 时会发生什么,例如:

    dosieve(10)
    sieve(createList(9), [])
    sieve([1,2,3,4,5,6,7,8,9], [])
    

    从那里:

    sieve(removeMult([2, 3, 4, 5, 6, 7, 8, 9], 1), 1 :: [])
    sieve([], [1])
    [1]
    

    哎呀。您删除了 1 的所有倍数,但它们当然是 all 1 的倍数。

    可能是这样的:

    fun sieve([], primes) = primes
      | sieve(1::ns, primes) = sieve(ns, 1 :: primes)
      | sieve(n::ns, primes) = sieve(removeMult(ns, n), n :: primes);
    

    【讨论】:

    • 有道理!感谢您的帮助。
    猜你喜欢
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-31
    • 2016-10-29
    相关资源
    最近更新 更多