2017-05-07 7 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

なぜ「プライム」の戻り値の型を指定しなかったのですか?なぜあなたはあなたの "再帰的な"呼び出しで戻り値を使用していないのですか? – UnholySheep

答えて

1

あなたのコードでは、論理的に正しくないさらなる再帰呼び出しで、引数としてiを渡していました。数字だけでなく、除数に関数primeを渡す必要があります。以下のコードは、あなたのロジックを実装する方法の1つです。

#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と呼びますが、これは素数をチェックしたい実際の値ではありません。その理由は動作しません。 2の倍数の場合は0が返されます。それ以外の場合は、無限ループが発生します。

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

当初mainprime(num, 2)のような除数2primeを呼び出します。

関連する問題