使用隐式return语句理解递归函数

时间:2012-11-18 16:22:34

标签: scala

下面的递归方法将范围

之间的整数值相加
  def sumInts(a: Int, b: Int): Int = {
    if(a > b) 0
    else {
      println(a +"," + b)
      a + sumInts(a + 1 , b)
    }
   } 

所以sumInts(2 , 5) returns 14

我对sumInts的递归调用如何求和整数范围感到困惑。可以用文字解释这种方法是如何工作的吗?

sumInts如何返回递增的值?也许我错过了这里递归的基本原理

1 个答案:

答案 0 :(得分:6)

通过首先计算范围[a + 1,b]的总和(通过递归调用sumInts(a + 1 , b))然后将a添加到{a}来计算范围[a,b]中的值的总和它

[更新] 在Scala中,return语句是可选的;函数返回最后一个表达式的值。因此上述函数体等同于

if(a > b) return 0
else {
  println(a +"," + b)
  return a + sumInts(a + 1 , b)
}

<强> [/更新]

对于范围[2,5],它会执行以下操作(为简单起见,我删除了println调用,并添加了括号来标记递归调用):

  1. if(2 > 5) 0 else 2 + sumInts(2 + 1, 5),条件为false,评估为
  2. 2 + sumInts(3, 5)
  3. 2 + (if(3 > 5) 0 else 3 + sumInts(3 + 1, 5))评估为
  4. 2 + (3 + sumInts(4, 5))
  5. 2 + (3 + (if(4 > 5) 0 else 4 + sumInts(4 + 1, 5)))评估为
  6. 2 + (3 + (4 + sumInts(5, 5)))
  7. 2 + (3 + (4 + (if(5 > 5) 0 else 5 + sumInts(5 + 1, 5))))评估为
  8. 2 + (3 + (4 + (5 + sumInts(6, 5))))
  9. 2 + (3 + (4 + (5 + (if(6 > 5) 0 else 6 + sumInts(6 + 1, 5))))),条件为true,评估为
  10. 2 + (3 + (4 + (5 + (0))))