Java-欧几里德算法的递归函数
我似乎无法成功地将以下算法转换为Java,请原谅糟糕的图片质量,但我正在解决的一个问题是: 我尝试使用以下代码来表示欧几里德算法,但它似乎不起作用。我真的不知道如何用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 %
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次递归。仅供参考:这个答案以前更有用(请参见编辑历史记录)。