List 如何在其条件下使用不完整列表
List 如何在其条件下使用不完整列表,list,haskell,list-comprehension,List,Haskell,List Comprehension,我知道。。标题解释得不好。如果您有更好的标题,请在评论中告诉我。我正在制作一个质数生成器,用于娱乐和学习。以下是我的代码: divisors x xs = [ y | y <- [1]++xs++[x], x `mod` y == 0] isPrime x xs = divisors x xs == [1,x] primeLst = [ x | x <- [2..], isPrime x primeLst] 除数x xs=[y | y计算primeLst的至少一个元素需要计算isP
我知道。。标题解释得不好。
如果您有更好的标题,请在评论中告诉我。
我正在制作一个质数生成器,用于娱乐和学习。
以下是我的代码:
divisors x xs = [ y | y <- [1]++xs++[x], x `mod` y == 0]
isPrime x xs = divisors x xs == [1,x]
primeLst = [ x | x <- [2..], isPrime x primeLst]
除数x xs=[y | y计算primeLst
的至少一个元素需要计算isPrime 2 primeLst
的至少两个元素需要计算除数2 primeLst
的至少两个元素需要计算[1]++primeLst++[2]
,这至少需要计算primeLst
中的一个元素。不会发生
您可能能够使用[1]++(primesLessThan x)+[x]
使某些东西工作,但我看不到一种定义(primesLessThan x)的简单方法
就避免计算循环的primeLst
而言。计算primeLst
的至少一个元素需要计算isPrime 2 primeLst
这需要计算至少两个元素的除数2 primeLst
,这需要计算[1]的至少两个元素++primeLst++[2]
,这要求至少计算primeLst
的一个元素。这不会发生
您可能能够使用[1]++(primesLessThan x)+[x]
使某些东西工作,但我看不到一种定义(primesLessThan x)的简单方法
关于避免计算循环的primeLst
。让我们先看看除数函数。它有点正确,只有两个问题:
xs
参数应该是什么?从定义来看,它应该是x
下面的所有素数-让我们称这些为候选素数。因此,如果x
是10
,那么候选素数应该是[2,3,5,7]
。但是,这不是函数作为参数得到的结果。在代码中,xs
是素数的无限列表
从技术上讲,除数
不会返回所有除数。除数16[2,3,5,7,11,13]
不会返回8
。但这是一个小细节
因此,如果我们可以使用正确的素数列表调用除数,那么我们应该可以,并且isPrime
函数也可以
问题在于获取候选素数的列表。为了清楚起见,我将首先给出代码,然后解释:
primeLst = 2 : [ x | x <- [3..], isPrime x (takeWhile (\p -> p*p <= x) primeLst)]
最后一个问题很难回答,因此如果您有问题,请将其发布在评论中。让我们先看看除数函数。它有点正确,只有两个问题:
dividedBy a b = a `mod` b == 0
isPrime x = null $ filter (x `dividedBy`) $ takeWhile (\y -> y * y <= x) primeLst
primeLst = 2:(filter isPrime [3..])
xs
参数应该是什么?从定义来看,它应该是x
下面的所有素数-让我们称这些为候选素数。因此,如果x
是10
,那么候选素数应该是[2,3,5,7]
。但是,这不是函数作为参数得到的结果。在代码中,xs
是素数的无限列表
从技术上讲,除数
不会返回所有除数。除数16[2,3,5,7,11,13]
不会返回8
。但这是一个小细节
因此,如果我们可以使用正确的素数列表调用除数,那么我们应该可以,并且isPrime
函数也可以
问题在于获取候选素数的列表。为了清楚起见,我将首先给出代码,然后解释:
primeLst = 2 : [ x | x <- [3..], isPrime x (takeWhile (\p -> p*p <= x) primeLst)]
最后一个问题很难回答,因此如果您有问题,请在评论中发表。被a b=a`mod`b==0分割
dividedBy a b = a `mod` b == 0
isPrime x = null $ filter (x `dividedBy`) $ takeWhile (\y -> y * y <= x) primeLst
primeLst = 2:(filter isPrime [3..])
iPrime x=null$filter(x`dividedBy`)$takeWhile(\y->y*y*ydividedBy a b=a`mod`b==0
isPrime x=null$filter(x`dividedBy`)$takeWhile(\y->y*y*y提示:您只需要测试素数到数字平方根的可除性,因为任何大于平方根的除数都伴随着一个小于平方根的除数。谢谢@hammar..我计划在解决这个问题后这样做:)提示:您只需要测试素数在数字平方根以下的可除性,因为任何大于平方根的除数都伴随着一个小于平方根的除数。谢谢@hammar..我计划在解决此问题后执行此操作:)然后我将以以下方式修改我的代码:primeLst=[2]++[x | x然后我将以这种方式修改我的代码:primeLst=[2]++[x | x感谢您的澄清和时间:D Haskell是一种有趣的编程语言。下面是我的答案:1.因为Haskell很懒惰,所以只需要primeLst中的数字,它们的平方根就小于x,而不需要计算其他列表元素。2.因为iPrime会检查除数是否为1和x,以及在这个代码中,x不存在,我认为用pp替换p第一个问题的答案是由哈马尔在他对你的问题的评论中给出的。14的平方根在3到4之间,所以候选素数是[2,3]
还是[2,3,5,7,11,13]都没有关系
,因为即使7除以14,7也有一对(即2)下面的平方根也除以14。因此,您不需要在候选素数中包含高于平方根的数字,因为它们将与平方根以下的数字配对,平方根以下的数字将包含在缩减的候选素数中。@IderAghbal:UsehPutStrLn
而不是hPrint
。后者调用de>show
将结果格式化为Haskell值,这样字符串就可以得到引号等。hPutStrLn
直接写入字符串。@IderAghbal:This code(使用takeWhile(\p->p*p@IderAghbal:cont:returnFalse),只要它意识到素数x
cont