2017-05-07 107 views
-3
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)這樣的主函數屬於遞歸或不屬於我,我感到困惑。

+1

當然是,爲什麼不是呢??? –

+4

是的。當一個函數直接或間接地調用它自己時,它是按照定義遞歸的。這就是說,正如@UnholySheep所指出的,這個功能是無意義的。它仍然是遞歸的。 –

+3

爲什麼你不指定'prime'的返回類型?你爲什麼不在你的「遞歸」調用中使用返回值? – UnholySheep

回答

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

在遞歸調用期間,您正在調用素數爲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與除數2mainprime(num, 2)