Haskell素数序列递归
Haskell primes number sequence recursion
我需要创建一个不带任何参数的素数函数,returns 我需要列出所有素数。
这是我想出的代码:
isqrt = floor . sqrt . fromIntegral
primes = 2:3:(primes' 4)
primes' n =
if (all(\y-> (y < isqrt n) && ((n `mod` y) /= 0)) primes)
then
n:primes' (n+1)
else
primes` (n+1)
程序只打印 2:3: 然后就停止了。
这不应该因为惰性评估而起作用吗? (通过将素数作为到目前为止构建的列表,并能够查看我当前的数字是否可以被该列表中的任何数字整除,然后如果是则追加它并继续递归,如果不能继续递归)。
任何人都可以指出我的错误吗?
一些要点:从技术上讲,您的程序不打印任何内容。其次,它甚至无法编译——请注意最后一行的错别字。
关于您的问题:在您的函数中,您在无限列表 primes
上调用 all
,而 all
试图遍历所有列表——这就是程序挂起的原因。您只需要从 primes
中获取您需要的元素,然后才应用 all
。例如:
isqrt = floor . sqrt . fromIntegral
primes = 2:3:(primes' 4)
primes' n =
if (all (\y-> (n `mod` y) /= 0) (takeWhile (<= isqrt n) primes))
then
n:primes' (n+1)
else
primes' (n+1)
main = print (take 5 primes)
编辑: 按照@behzad.nouri 的建议使用 takeWhile
。
我需要创建一个不带任何参数的素数函数,returns 我需要列出所有素数。 这是我想出的代码:
isqrt = floor . sqrt . fromIntegral
primes = 2:3:(primes' 4)
primes' n =
if (all(\y-> (y < isqrt n) && ((n `mod` y) /= 0)) primes)
then
n:primes' (n+1)
else
primes` (n+1)
程序只打印 2:3: 然后就停止了。 这不应该因为惰性评估而起作用吗? (通过将素数作为到目前为止构建的列表,并能够查看我当前的数字是否可以被该列表中的任何数字整除,然后如果是则追加它并继续递归,如果不能继续递归)。
任何人都可以指出我的错误吗?
一些要点:从技术上讲,您的程序不打印任何内容。其次,它甚至无法编译——请注意最后一行的错别字。
关于您的问题:在您的函数中,您在无限列表 primes
上调用 all
,而 all
试图遍历所有列表——这就是程序挂起的原因。您只需要从 primes
中获取您需要的元素,然后才应用 all
。例如:
isqrt = floor . sqrt . fromIntegral
primes = 2:3:(primes' 4)
primes' n =
if (all (\y-> (n `mod` y) /= 0) (takeWhile (<= isqrt n) primes))
then
n:primes' (n+1)
else
primes' (n+1)
main = print (take 5 primes)
编辑: 按照@behzad.nouri 的建议使用 takeWhile
。