2011-12-31 3 views
2
の再帰関数

私は成功したJavaに次のアルゴリズムを変換することができないよう、恐ろしい画質を許してください、私が働いている質問は尋ねる:のJava - ユークリッドアルゴリズム

Euclidean Algorithm

私はユークリッドアルゴリズムを表すために次のコードを使用しようとしましたが、うまくいかないようです。私はJavaコードでどのように表現するのか、実際には分かりません。どんな助け?

public static int gcd(int x, int y) { 
    if (y == 0) { 
     return x; 
    } else if (x >= y && y > 0) { 
     return gcd(y, (x % y)); 
    } 
} 

ありがとうございます。

+0

テキストブックアルゴリズムに正しく従っています。テキストブックのアルゴリズムが不完全なのは、どちらのカテゴリも満たされていない場合を考慮していないからです。 – Mysticial

+0

どのように動作しませんか?あなたがそれを呼び出すと実際に何が起こるのですか?どのような議論に合格し、それは何を返すのですか? –

+6

@KeithThompson OPのすぐ問題は、コードがコンパイルされないことです。 – dasblinkenlight

答えて

6

xとyの間に任意の順序はありません。

+1

'return y == 0? x:gcd(y、x%y); 'あなたが必要なのはすべてです。どちらが大きいかは関係ありません。しかし、1回の再帰が必要です。 – st0le

+0

FYI:この回答はこれまでより役に立ちました(編集履歴を参照)。 – nobar

2

あなたはほぼそこにいます。 y > xを実行したときに何が起きるかを検討し、最後のelseブランチから結果を返します(ヒント:xyは場所を自由に切り替えることができます)。

1

あなたはほぼそこにいます。

キャッチオール句が関数から返されないため、コードがコンパイルされません。

この関数には、負の値のyを渡すかどうかによって大きく異なります。正の値のみが必要な場合は、例外をスローします。

public static int gcd(int x, int y) { 

    if (y == 0) { 

     return x; 

    } else if (x >= y && y > 0) { 

     return gcd(y, (x % y)); 

    } 

    throw 
     new IllegalArgumentException(
      String.format(
       "Unexpected values for x(%d) and y(%d)", 
       Integer.valueOf(x), 
       Integer.valueOf(y) 
      ) 
     ); 
} 
+0

理想的には、負の値を含めることができます。 – mino

+1

@ m92割り当てからの漸化式は負の数をカバーしません。 – dasblinkenlight

4

コードが完成していません!

どうすればx < y?あなたのコードは値を返しません!

本書で触れられていないのは、関数の2つのパラメータが必ずしも降順である必要はないということです(つまり、x >= y)。あなたがする必要があるのは、この事実を考慮してgcdを計算することです。

は、単にあなたが次の操作を行うことができます。

public static int gcd (int x , int y) 
{ 
    if (y == 0)       
     return x; 
    else if (x >= y && y > 0) 
     return gcd (y , x % y); 
    else return gcd (y , x);  // if x < y then go ahead and switch them around. 
} 
0

は、ここで私が持っているものだという負の数のアカウント:負の数と

public static int gcd(int x, int y) 
{ 
    if (y == 0) 
     return x; 
    if (x < 0) 
     return gcd(x * -1, y); //turns the first parameter to a positive if it's initally negative 
    if (y < 0) 
     return gcd(x, y * -1); //turns the second parameter to a positive if it's initally negative 
    if (y <= x && x % y == 0) 
     return y; 

    return gcd(y, x%y); 
} 

注意、あなたは最大公約数を見つけるためにしようとすると、どちらかの数字が負の場合は、正の値に変更するだけで、結果は同じになります。

両方の数字が負の場合、私はgcdがどうあるべきかわかりません。 1? -1? idkので、私はそれを残しました。私がコードしているのは、両方が陽性であるかのように扱います。

関連する問題