2015-07-18 2 views
0

Первичная функция проверки моих показывает 9,15 и т. Д., Как премьер, где они не являются. Мой код:Почему оператор возврата в моей заданной пользователем функции не работает в каком-то случае?

#include<iostream> 
#include<cstdio> 
using namespace std; 
int prime_function(int num, int i); 
int main(){ 
    int num,flag=0; 
    while (cin>>num){ 
     if(num!=1){ 
      flag=prime_function(num,2); 
      if(flag==0) 
       printf("%d isn't a prime.\n",num); 
      else { 
       printf("%d is a prime.\n",num); 
      } 
     } 
     else { 
      printf("%d is a prime.\n",num); 
     } 
    } 
    return 0; 
} 

int prime_function(int num, int i) 
{ 
    if(num%i==0){ 
     printf("when num mod i == 0, num=%d i=%d\n",num,i); 
     return 0;//This Statement doesn't work for like num=9,15... 
    } 
    else if((i*i)+1<=num){ 
     printf("when num mod i != 0, num=%d i=%d\n",num,i); 
     prime_function(num,++i); 
    } 
    printf("Going to main function.\n"); 
    return 1; 
} 

Я сделал код довольно много графическим, чтобы ошибки можно было легко найти. Когда я ввожу 9, моя программа показывает:

when num mod i != 0, num=9 i=2 
when num mod i == 0, num=9 i=3 
Going to main function. 
Going to main function. 
9 is a prime. 

Он должен печатать «Переход к основной функции». один раз, а затем перейти к основной функции. Но он не выполняет и не проходит через всю функцию, а затем переходит к основной функции. Может ли кто-нибудь помочь мне с этой проблемой?

ответ

2

Вместо

prime_function(num,++i); 

Вы хотите

return prime_function(num,++i); 
+0

Он отлично работает, но вы можете объяснить, как он решает мою проблему? –

+1

@AhashanAlamSojib, потому что так работает рекурсия. Я предлагаю рассмотреть более простой пример, например. вычисление factorial: 'int fac (int i) {return (i == 1)? (1) :(i * fac (i-1));}' – user463035818

+0

Да, я использовал назначение прямого возврата для факториальных функций. Наверное, я был в замешательстве о вызове функции из возвращения. Спасибо @AlanStokes ... –

1

Вы должны проверить возвращаемое значение Вашего рекурсивного вызова prime_function; в то время как его возвращаемое значение игнорируется, и функция вернет true в случаях, когда это не должно.

else if((i*i)+1<=num){ 
    printf("when num mod i != 0, num=%d i=%d\n",num,i); 
    if (!prime_function(num,++i)) 
     return 0; 
} 
Смежные вопросы