一个简单的递归函数打印出奇怪的东西

时间:2016-01-18 00:03:32

标签: c recursion

所以我需要编写一个递归函数来验证数字是否为素数。 算法很简单,工作正常,只是当我打印函数而不是显示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);
}

3 个答案:

答案 0 :(得分:3)

您正在打印isPrimal()功能的地址,您应将其更改为

printf("The result is %d\n", isPrimal(n, p));

并且不要忘记检查scanf()的返回值。

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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;
}