簡體   English   中英

一個簡單的遞歸函數打印出奇怪的東西

[英]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()的返回值。

所述printfmain調用未定義的行為,因為你傳遞函數的地址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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM