Java-欧几里德算法的递归函数

Java-欧几里德算法的递归函数,java,Java,我似乎无法成功地将以下算法转换为Java,请原谅糟糕的图片质量,但我正在解决的一个问题是: 我尝试使用以下代码来表示欧几里德算法,但它似乎不起作用。我真的不知道如何用Java代码来表示它。有什么帮助吗 public static int gcd(int x, int y) { if (y == 0) { return x; } else if (x >= y && y > 0) { return gcd(y, (x %

我似乎无法成功地将以下算法转换为Java,请原谅糟糕的图片质量,但我正在解决的一个问题是:

我尝试使用以下代码来表示欧几里德算法,但它似乎不起作用。我真的不知道如何用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));
    }
}

谢谢。

你就快到了。你需要考虑当<代码> y> x < />代码时发生了什么,并从最终的<代码> > <代码> >分支(提示:<代码> x< /代码>和<代码> y>代码>可以自由切换位置)。

你几乎在那里。

您的代码不会编译,因为没有从函数返回的catch-all子句

这实际上取决于您是否将
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 )
            )
        );
}

x和y之间没有任意顺序。

您的代码不完整

如果
x
?您的代码不会返回值

这本书没有提到的是,函数的两个参数不一定需要按降序排列(即
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.
}
publicstaticintgcd(intx,inty)
{
如果(y==0)
返回x;
如果(x>=y&&y>0),则为else
返回gcd(y,x%y);
否则返回gcd(y,x);//如果x
以下是我得到的关于负数的解释:

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);
}
publicstaticintgcd(intx,inty)
{
如果(y==0)
返回x;
if(x<0)
返回gcd(x*-1,y);//如果第一个参数初始为负,则将其变为正
if(y<0)
返回gcd(x,y*-1);//如果第二个参数初始为负,则将其变为正

如果(Y你正确地遵循了文本算法。只是文本算法是不完整的——因为它不考虑两个类别都不满足的情况。它如何不起作用?当你调用它时发生了什么?你传递了什么参数,它又返回了什么?”KeththppsPon,我确信OP的即时问题是。代码没有编译。@dasblinkenlight:啊,非常正确。OP仍然应该提到这一点,而不是“但它似乎不起作用”。理想情况下,我希望包含负值。@m92赋值的递归公式不包含负数。
返回y==0?x:gcd(y,x%y)
是您所需要的全部。哪一个更大并不重要。不过,这需要1次递归。仅供参考:这个答案以前更有用(请参见编辑历史记录)。