возвращаемое значение отличается от значения, рассчитанного в функции - PullRequest
0 голосов
/ 04 ноября 2019

Возвращаемое значение должно быть 7 и рассчитывается правильно в функции gcd. Поэтому я возвращаю значение в строке 7.

Но в основной функции, когда я распечатывал возвращаемое значение, оно равно 3. Я не знаю почему.

int gcd(int p, int q) 

 {

    if(p<q){gcd(q,p);}
    if(q==0)
    {
        cout<<"p: "<<p<<endl; //This prints out 7
        return p;
    }
    else gcd(q,p%q);
}
int main()
{
    int n;
    int count=0;
    cin>>n;
    while(n--)
    {
    count++;
    cout<<"Pair #"<<count<<": ";
    string input,input2;
    cin>>input>>input2;
    int sum1=0,sum2=0;
    int g;      
    for(int i=0;i<input.size();i++)
    {
        if(input[i]-'0'==1)
            sum1+=pow(2,input.size()-1-i);
    }
    for(int i=0;i<input2.size();i++)
    {
        if(input2[i]-'0'==1)
            sum2+=pow(2,input2.size()-1-i);
    }
    cout<<sum1<<" "<<sum2<<endl;
    g = gcd(sum1,sum2);
    cout<<"g: "<<g<<endl; //but this print out 3

  }
}

1 Ответ

1 голос
/ 04 ноября 2019

Рекурсивные функции работают точно так же, как нерекурсивные функции, включая то, что вызов функции не приводит к автоматическому и немедленному возвращению результата этого вызова функции.

Вам необходимо возвращать значение для каждого пути выполнения, иначе ваш код будет иметь неопределенное поведение;

int gcd(int p, int q) 
{
    if (p < q)
    {
        return gcd(q, p);
    }
    if (q == 0)
    {
        cout << "p: " << p << endl;
        return p;
    }
    else 
        return gcd(q, p % q);
}

(Приличный компилятор должен быть в состоянии предупредить вас о пропущенных return sУзнайте, как включить такие предупреждения.)

...