2017-05-31 3 views
-3

J'essaie d'écrire une fonction GCD pour calculer gcd de deux entiers en utilisant l'algorithme euclids. Dans la fonction si j'efface "else" il sort 3 qui est incorrect. Mais si j'utilise "else", il sort 1 qui est la sortie correcte. je suppose que si je n'utilise pas "else" la fonction est toujours correcte. Pourquoi suis-je obtenir deux sorties différentes.Pourquoi la sortie diffère si j'efface "else" de la fonction?

Voici mon code,

#include <iostream> 

using namespace std; 


int euclidGcd(int x , int y){ 

    if(x%y!=0) 
     euclidGcd(y , x%y); 
    else 
     return y; 

} 

int main(){ 

    cout<<euclidGcd(2,3)<<"\n"; 


    return 0; 
} 
+2

La branche 'if' ne renvoie pas de valeur. –

+2

Lorsque 'x% y == 0', votre fonction ne retourne pas; c'est un comportement indéfini – Justin

+0

merci de votre aide .. :) –

Répondre

2

Votre fonction a un comportement non défini. Lorsque l'opérateur % renvoie une valeur non nulle, votre fonction ne retourne rien du tout, donc la sortie est garbage. Vous devez retourner le résultat de l'appel récursif:

int euclidGcd(int x, int y) 
{ 
    if ((x % y) != 0) 
     return euclidGcd(y, x % y); // <-- here 
    else 
     return y; 
} 

Cependant, sur la base Wikipedia's description de l'algorithme, la fonction devrait ressembler à ceci:

int euclidGcd(int x, int y) 
{ 
    if (y != 0) 
     return euclidGcd(y, x % y); 
    else 
     return x; 
} 

Ou, en utilisant les autres implémentations décrites que ne pas utiliser du tout récursion:

basées sur la division:

int euclidGcd(int x, int y) 
{ 
    while (y != 0) 
    { 
     int t = y; 
     y = x % y; 
     x = t; 
    } 
    return x; 
} 

Basé sur la soustraction:

int euclidGcd(int x, int y) 
{ 
    while (x != y) 
    { 
     if (x > y) 
      x -= y; 
     else 
      y -= x; 
    } 
    return x; 
}