objc
r(22,18)
有人可以引导我完成为什么这会返回4的逻辑,我无法理解它。
答案 0 :(得分:3)
这不会返回4.它返回2.最简单地查看每个递归调用r
:
当您致电r(22, 18)
时x>y
分支被点击,以便下一个电话为r(22-18, 18)
或r(4, 18)
。
当r(4, 18)
被调用时,您点击了else
分支,以便下次通话为r(4, 18-4)
或r(4, 14)
。
接下来几个会点击else
分支,产生以下呼叫:
r(4, 14)
r(4, 10)
r(4, 6)
r(4, 2)
现在,r(4, 2)
我们再次点击了x>y
分支,产生了r(4-2, 2)
或r(2, 2)
。
r(2, 2)
满足x==y
的基本案例分支,因此我们只需返回x
(2)。
要使用不同的示例进行测试,您可以稍微修改该功能以打印每个调用:
scala> def r(x: Int, y: Int): Int = {
| println(s"r($x, $y)")
| if (x == y) x
| else if (x > y) r(x-y, y)
| else r(x, y-x)
| }
r: (x: Int, y: Int)Int
scala> r(22, 18)
r(22, 18)
r(4, 18)
r(4, 14)
r(4, 10)
r(4, 6)
r(4, 2)
r(2, 2)
res1: Int = 2
答案 1 :(得分:1)
我同意@gregghz它返回 2 而不是 4 ,你可以清楚地看到它here。但我认为关于为什么它返回 2 的正确观点是因为它是为了这样做而设计的。如果最老的已知算法 - the Euclidean algorithm用于计算GCD aka Greatest Common Divisor,则会执行此算法。显然gcd(22,18) = 2