2016-01-18 60 views
1

所以我需要編寫一個遞歸函數來驗證數字是否是質數。 該算法非常簡單,工作正常,只是當我打印的功能,而不是顯示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); 
} 
+0

爲什麼你忽略'scanf()'的返回值。如果''n'沒有在'scanf()'初始化,你將永遠不會知道並在'p =(n-1)'處使用它,這使得'p'內容不確定,然後調用'isPrimal()'。 –

+0

我看到的答案(其中兩個)解決了你的第一個問題,但你很快就會發現更多。你的函數並不總是返回一個值,所以你有時會返回垃圾。這也是確定數字素數的極其低效的方法。我不確定你可以安全地使用它,即使是最大的32位有符號整數,更不用說更大的了。 –

回答

3

正在打印的isPrimal()函數的地址,你應該將其更改爲

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

,不要忘記檢查scanf()的返回值。

3

mainprintf調用未定義的行爲,因爲你傳遞給函數isPrimal而不是其結果的地址:變化printf("The result is %d\n", isPrimal);

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

而且,你的算法是非常低效的。函數isPrimal以遞歸方式調用n-2次。如果您刪除printf語句,編譯器會注意到自己的尾部調用,並將此遞歸轉換爲循環。如果您有printf聲明,則無法執行此操作,對於較大的n值,您可能會過度沉重並導致Stackoverflow

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