2017-05-31 6 views
-3

私はeuclidsアルゴリズムを使って2つの整数のgcdを計算するGCD関数を書こうとしています。この関数では、 "else"を消去すると3が出力されますが、それは間違っています。しかし、私が "else"を使うと、正しい出力である1が出力されます。もし私が "else"を使わないとすれば、関数はまだ正しいと思います。なぜ私は2つの異なる出力を得ているのですか?ここで関数から "else"を消去すると出力が異なるのはなぜですか?

#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

'if'ブランチは値を返しません。 –

+2

'x%y == 0'のとき、関数は戻りません。これは未定義の動作です – Justin

+0

助けてくれてありがとう.. :) –

答えて

2

あなたの関数は未定義の動作を持って、私のコードです。 %演算子がゼロ以外の値を返すと、関数は何も返さないので、出力はガベージです。あなたは、再帰呼び出しの結果を返す必要があります。

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

しかし、アルゴリズムのWikipedia's descriptionに基づいて、機能ではなく、次のようになります。

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

それとも、他の記述の実装を使用してすべての再帰を使用しないでください。

部門ベース:

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

減算ベース:

int euclidGcd(int x, int y) 
{ 
    while (x != y) 
    { 
     if (x > y) 
      x -= y; 
     else 
      y -= x; 
    } 
    return x; 
} 
関連する問題