递归函数scala

时间:2018-02-04 15:51:25

标签: scala

objc

r(22,18)

有人可以引导我完成为什么这会返回4的逻辑,我无法理解它。

2 个答案:

答案 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