这个递归的例子是否正确?

时间:2017-05-07 08:49:36

标签: c recursion iteration

int main() {
    int num;

    printf("Enter a number\n");
    scanf(" %d", &num);

    num = prime(num);

    if (num == 0)
        printf("This is not a prime number");

    if (num == 1)
        printf("This is a prime number");
}

prime(int num) {
    static i = 2;

    if (num % i == 0)
        return 0;

    prime(i + 1);

    return 1;
}

请注意,它在某些编译器中不起作用。

我想知道我们是否可以称之为递归。

具体来说,如果调用像prime(i + 1)这样的素数函数属于递归,我会感到困惑。

2 个答案:

答案 0 :(得分:1)

在您的代码中,您将i作为参数传递给进一步的递归调用,这在逻辑上是不正确的。你需要传递数字和除数函数prime。下面的代码是实现逻辑的方法之一。

#include<stdio.h>

 int prime(int num,int i)
 {

    if(num==i)
        return 1;

    if(num % i == 0)
        return 0;

    return prime(num,i+1);
 }



 int main()

 {

   int num;

   printf("Enter a number\n");
   scanf(" %d", &num);
   if(num>1){
      num = prime(num,2);
      if(num == 0)
         printf("This is not a prime number");

      else
          printf("This is a prime number");
    }
    else printf("This is neither prime nor composite");
    return 0;
  }

请注意,不执行输入验证,并假设用户只输入正整数。

答案 1 :(得分:1)

你在递归调用期间用i调用素数,这不是你要检查素数的实际值,这就是它不工作的原因! 只有0的倍数才会返回2,否则会被卡在无限循环中。

int prime(int num) {
    static i = 2;
    if(num % i == 0)
        return 0;

    prime(i + 1); // passing i instead of num
    return 1;
}

您可以将除数与数字一起传递,并在每次递归调用中使用1增加除数。

int prime(int num, int d) {
    if(num == 0 || num == 1 || num % d == 0)
        return 0;
    if(d <= sqrt(num)) // num will not be divisible by d > sqrt(num)
        prime(num, d + 1);
    return 1;
}

最初使用prime中的2prime(num, 2)之类的除数main拨打id