[英]A simple recursion function prints weird stuff
所以我需要编写一个递归函数来验证数字是否为素数。 算法很简单,工作正常,只是当我打印函数而不是显示1或0时,它显示随机废话(可能是地址?),我找不到原因。
编码:
int isPrimal(int n, int p) {
if (p == 1) {
return 1;
}
if (n % p == 0) {
return 0;
}
isPrimal(n, p - 1);
printf("n = %d i = %d\n", n, p);
}
int main() {
int numcase, *A, sizeA = 0, i = 0, cnt3dig = 0, n, p;
printf("Enter a number to check for primality\n");
scanf("%d", &n);
p = (n - 1);
printf("The result is 1 if the number is a prime, 0 otherwise\n");
isPrimal(n, p);
printf("The result is %d\n", isPrimal);
}
您正在打印isPrimal()
函数的地址,您应该将其更改为
printf("The result is %d\n", isPrimal(n, p));
并且不要忘记检查scanf()
的返回值。
所述printf
在main
调用未定义的行为,因为你传递函数的地址isPrimal
而不是其结果是:改变printf("The result is %d\\n", isPrimal);
至
printf("The result is %d\n", isPrimal(n, p));
此外,您的算法效率非常低。 函数isPrimal
递归调用n-2
次。 如果删除printf
语句,编译器会注意到对自身的尾调用,并将此递归转换为循环。 当你有printf
语句时,它不能这样做,对于大的n
值你可能会过于沉重并导致Stackoverflow
。
There are 2 changes that are necessary
1.在main中,打印输出时进行函数调用 - 不是对函数位置的引用。 2.在isPrimal中,在print语句之后递归调用isprimal。
#include<stdio.h>
#include<stdlib.h>
int isPrimal(int n, int p) {
if (p == 1) {
return 1;
}
if (n % p == 0) {
return 0;
}
printf("n = %d i = %d\n", n, p);
isPrimal(n, p - 1);
}
int main() {
int numcase, *A, sizeA = 0, i = 0, cnt3dig = 0, n, p;
printf("Enter a number to check for primality\n");
scanf("%d", &n);
p = (n - 1);
printf("The result is 1 if the number is a prime, 0 otherwise\n");
printf("The result is %d\n", isPrimal(n, p));
return 1;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.