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)
这样的素数函数属于递归,我会感到困惑。
答案 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
中的2
与prime(num, 2)
之类的除数main
拨打id
。