2017-05-07 71 views
-3
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)这样的主函数属于递归或不属于我,我感到困惑。

+1

当然是,为什么不是呢??? –

+4

是的。当一个函数直接或间接地调用它自己时,它是按照定义递归的。这就是说,正如@UnholySheep所指出的,这个功能是无意义的。它仍然是递归的。 –

+3

为什么你不指定'prime'的返回类型?你为什么不在你的“递归”调用中使用返回值? – UnholySheep

回答

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

在递归调用期间,您正在调用素数为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与除数2mainprime(num, 2)