static int gcd(int x, int y) {
if (y==0) return x;
return gcd(y, x%y);
}
当我的x = 585
和y = 78
我的方法在给出结果之前所执行的步数为3.当我更改订单时x = 78
和y = 585
步骤是4.这种依赖的原因是什么?我尝试了几对整数,并且x > y
步数为a
,然后在更改后,数字为a + 1
。
昨天我试着询问一下,我希望现在我更加清晰准确。
答案 0 :(得分:0)
在您的代码中添加一些System.out.println
之后,在继续查找GCD之前,您的方法会有意切换数字。这是585, 78
的输出:
再打一次电话。 X = 585 Y = 78
另一个电话。 X = 78 Y = 39
另一个电话。 X = 39 Y = 0
39
以下是78, 585
的输出:
再打一次电话。 X = 78 Y = 585
另一个电话。 X = 585 Y = 78
另一个电话。 X = 78 Y = 39
另一个电话。 X = 39 Y = 0
39
额外的电话来自切换两个号码。
解释
如果我们干这个代码的第一次执行,首先执行最大的数字,我们得到:
x = 585
y = 78
y is not equal to 0 so don't return x.
make recursive call with: y in the place of x. (this is the switch)
x % y in the place of y (585 % 78 = 39)
如果我们先使用最小的数字:
x = 78
y = 585
y is not equal to 0 so don't return x
make recursive call with: y in the place of x (so first argument is 585)
x % y in the place of y ( 78 % 585 = 78)
额外的调用是交换两个值,并且从模运算中可以清楚地知道这应该发生,给定x
和y
给定x < y
和{{ 1}},x > 0
。如果较小的数字保留在x % y = x
位置,则算法将运行并运行。