我需要实现一个递归函数,如果数字是素数则返回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(num-div div)
我在C中测试了一个算法,因为我的mac上没有Haskell编译器,但是有一些错误,因为它在primes-1
idk上返回误报为什么
int main (int argc, const char * argv[]){
int a=0,b=31;
printf("\n Prime numbers between %d and %d \n",a,b);
for(int a=0; a<=b; a++){
if(isPrime(a)==0){
printf("%d, ",a);
}
}
return 0;
}
int isPrime(int x){
return prime(x, sqrt(x));
}
int prime(int x, int i){
if(i==0){
return 0;
}
else if(mod(x,i)==1){
return 1;
}
else{
return prime(x, i-1);
}
}
int mod(int num, int div){
if(num<div) return num;
else return 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
答案 0 :(得分:5)
你的基本想法很好。在Haskell中,您可以使用列表而不是迭代。以下是您需要了解的内容:
[n^2 | n <- [1..10]]
的含义并使用类似的列表。sqrt
等功能
Integer
和Float
之间转换一些数字类型。当你这样做时,请查看Float -> Integer
和Integer -> Float
。 DON&#39; T 使用unsafeCoerce
- 它不安全并且会严重破坏。[Bool] -> Bool
。我为什么这么说? [Bool]
如何帮助,你怎么会制作一个? (再次修改列表理解。)你设置这个作业并不是因为部门因为决定102659473841923461是否为素数而被困,而是因为他们希望你学习一些Haskell。尽量不要在没有学习的情况下尝试解决问题 - 它只会使下一个任务变得更难! (这就是为什么我已经抵制了将另一个答案中的&#34;伪代码转换为Haskell的诱惑。)
答案 1 :(得分:1)
我不知道Haskell,我不想给你答案,但我可以提供一种方法。
如果你检查从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)