递归函数,用于查找数字是否为素数

时间:2012-09-13 22:05:13

标签: 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(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

2 个答案:

答案 0 :(得分:5)

你的基本想法很好。在Haskell中,您可以使用列表而不是迭代。以下是您需要了解的内容:

  1. 安装并使用ghci。
  2. 如果您不知道如何在Haskell中执行任何操作,请访问了解您的Haskell http://learnyouahaskell.com/
  3. 列出理解。倾向于[n^2 | n <- [1..10]]的含义并使用类似的列表。
  4. 在hoogle http://www.haskell.org/hoogle/
  5. 上查找sqrt等功能
  6. 由于Haskell是静态类型,因此您需要在IntegerFloat之间转换一些数字类型。当你这样做时,请查看Float -> IntegerInteger -> Float DON&#39; T 使用unsafeCoerce - 它不安全并且会严重破坏。
  7. 使用hoogle查找[Bool] -> Bool。我为什么这么说? [Bool]如何帮助,你怎么会制作一个? (再次修改列表理解。)
  8. 如果您发现更多并且有所作为,请回答更具体的问题。
  9. 请尽早开始作业,特别是如果您错过了课程!
  10. 你设置这个作业并不是因为部门因为决定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)