Haskell 递归函数,用于查找数字是否为素数
我需要实现一个递归函数,如果数字是素数,则返回1,否则返回0。作业问题说我不能使用“%”mod。Haskell应该是这样的。。。我不确定Haskell 递归函数,用于查找数字是否为素数,haskell,primes,Haskell,Primes,我需要实现一个递归函数,如果数字是素数,则返回1,否则返回0。作业问题说我不能使用“%”mod。Haskell应该是这样的。。。我不确定 isprime x = prime(x sqrt(x)) prime x i = | i==1 = 1 | mod(x i)==0 = 0 | otherwise = prime(x i-1) mod num div | num<div = n | otherwise = mod
isprime x = prime(x sqrt(x))
prime x i = | i==1 = 1
| mod(x i)==0 = 0
| otherwise = prime(x i-1)
mod num div | num<div = n
| otherwise = mod(num-div div)
算法将返回以下内容:
Prime numbers between 0 and 31
0, 1, 2, 3, 4, 6, 8, 12, 14, 18, 20, 24, 30,
Program ended with exit code: 0
我不知道哈斯克尔,我也不想给你答案,但我可以提供一种方法 如果检查从2到sqrt(n)的所有数字,并且没有一个是n的因子,那么n是素数 因此,使用以下伪代码的函数调用可能会起作用:
def isPrime(n):
return isPrimeHelper(n,sqrt(n))
def isPrimeHelper(n,counter):
if counter == 1 return True
if n % counter == 0 return False
else return isPrime(n,counter-1)
我不知道哈斯克尔,我也不想给你答案,但我可以提供一种方法 如果检查从2到sqrt(n)的所有数字,并且没有一个是n的因子,那么n是素数 因此,使用以下伪代码的函数调用可能会起作用:
def isPrime(n):
return isPrimeHelper(n,sqrt(n))
def isPrimeHelper(n,counter):
if counter == 1 return True
if n % counter == 0 return False
else return isPrime(n,counter-1)
你的基本想法很好。在Haskell中,您可以使用列表而不是迭代。以下是您需要了解的内容:
[n^2 | n Integer
和Integer->Float
。不要使用不安全的力量
-这是不安全的,会严重破坏东西[Bool]->Bool
。我为什么建议这样做?[Bool]
会有什么帮助,你会怎么做?(再次修改列表理解。)你布置这个家庭作业不是因为系里一直在想办法决定102659473841923461是否是最好的,而是因为他们想让你学一些哈斯克尔语。不要试图在不学习的情况下解决问题——这只会让下一个作业更难!(这就是为什么我抵制住了翻译这个句子的诱惑。)Haskell的另一个答案是“伪代码”。您的基本想法很好。在Haskell中,您可以使用列表而不是迭代。以下是您需要了解的内容:
[n^2 | n Integer
和Integer->Float
。不要使用不安全的强制力
-这是不安全的,会严重破坏事物[Bool]->Bool
。我为什么建议这样做?[Bool]
会有什么帮助,你会怎么做?(再次修改列表理解。)isprime x = prime x (floor $ sqrt $ fromIntegral x) where
prime x i | i==1 && x > 1 = 1
| x == i*div x i = 0
| otherwise = prime x (i-1)
-- mod x i = x - i*div x i
-- mod x i == 0 = x == i*div x i
fromIntegral
只是一个适配器,它允许我们使用Integral
值作为sqrt
的参数,而sqrt
需要一个浮动的
参数。在GHCi提示符下尝试使用:i sqrt
或:i Integral
等(还可以阅读谷歌上的一些文档)
但在算法上还有改进的地方。首先,最好从另一个方向尝试除数,从2到数字的sqrt
,因为任何给定的数字都可能有一个更小的因子,而不是一个更大的因子。其次,在尝试2之后,没有必要尝试任何其他偶数可除数,这给我们
isprime x | x == 2 = 1
| x < 2 || even x = 0
| otherwise = go 3
where
r = floor $ sqrt $ fromIntegral x
go i | i > r = 1
| x == i*div x i = 0 -- really, | rem x i == 0 = 0
| otherwise = go (i+2)
还有一些冗余:在我们测试了3之后,就不需要再测试它的倍数了(就像我们测试2和偶数一样)。我们只需要测试基本因子:
isPrime x=x>1&&
[rem x d/=0 | d(显然,有一项关于家庭作业的新政策,也就是说,就这样)
基本上,您的代码几乎是正确的(1不是质数),没有一些语法问题
isprime x = prime x (floor $ sqrt $ fromIntegral x) where
prime x i | i==1 && x > 1 = 1
| x == i*div x i = 0
| otherwise = prime x (i-1)
-- mod x i = x - i*div x i
-- mod x i == 0 = x == i*div x i
fromIntegral
只是一个适配器,它允许我们使用Integral
值作为sqrt
的参数,而sqrt
需要一个浮动的
参数。在GHCi提示符下尝试使用:i sqrt
或:i Integral
等(还可以阅读谷歌上的一些文档)
但在算法上还有改进的地方。首先,最好从另一个方向尝试除数,从2到数字的sqrt
,因为任何给定的数字都可能有一个更小的因子,而不是一个更大的因子。其次,在尝试2之后,没有必要尝试任何其他偶数可除数,这给我们
isprime x | x == 2 = 1
| x < 2 || even x = 0
| otherwise = go 3
where
r = floor $ sqrt $ fromIntegral x
go i | i > r = 1
| x == i*div x i = 0 -- really, | rem x i == 0 = 0
| otherwise = go (i+2)
还有一些冗余:在我们测试了3之后,就不需要再测试它的倍数了(就像我们测试2和偶数一样)。我们只需要测试基本因子:
isPrime x=x>1&&
[rem x d/=0 | d在这里搜索[haskell]test prime
,你会发现你不是第一个尝试这个的人-偷一些想法,决定哪一个是最好的。我甚至不能开始,不知道递归是如何与haskell一起工作的,我只知道如何用C中的普通循环为(int i=2;i@Vitim.us这不是递归调用,而是一种迭代方法。“问题是我不能使用“%”mod“请告诉我”