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

use*_*254 0 scala

下面的递归方法将一个范围之间的整数值相加

  def sumInts(a: Int, b: Int): Int = {
    if(a > b) 0
    else {
      println(a +"," + b)
      a + sumInts(a + 1 , b)
    }
   } 
Run Code Online (Sandbox Code Playgroud)

所以 sumInts(2 , 5) returns 14

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

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

Pét*_*rök 6

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

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

if(a > b) return 0
else {
  println(a +"," + b)
  return a + sumInts(a + 1 , b)
}
Run Code Online (Sandbox Code Playgroud)

[/更新]

对于范围[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))))

  • 小心这个肯定,`a`实际上从来没有"更新",更正确地说,对于每个递归调用,该方法被调用不同的参数值,但是'a`在每次递归期间保持不变. (2认同)