Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 用隐式返回语句理解递归函数_Scala - Fatal编程技术网

Scala 用隐式返回语句理解递归函数

Scala 用隐式返回语句理解递归函数,scala,Scala,下面的递归方法对一个范围内的整数值求和 def sumInts(a: Int, b: Int): Int = { if(a > b) 0 else { println(a +"," + b) a + sumInts(a + 1 , b) } } 因此sumInts(2,5)返回14 我对sumInts的递归调用如何对整数范围求和感到困惑。你能用文字解释这个方法是如何工作的吗 sumInts如何返回递增的值??也许我在这里遗漏了递

下面的递归方法对一个范围内的整数值求和

  def sumInts(a: Int, b: Int): Int = {
    if(a > b) 0
    else {
      println(a +"," + b)
      a + sumInts(a + 1 , b)
    }
   } 
因此
sumInts(2,5)返回14

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


sumInts如何返回递增的值??也许我在这里遗漏了递归的一些基本内容

它首先计算范围[a+1,b]的和(递归调用
sumits(a+1,b)
),然后向其中添加
a
,从而计算范围[a,b]中的值之和

[Update]在Scala中,
return
语句是可选的;函数返回最后计算的表达式的值。因此,上述功能体相当于

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

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

  • if(2>5)0 else 2+sumInts(2+1,5)
    条件为
    false
    ,计算结果为
  • 2+消费(3,5)
  • 2+(如果(3>5)0 else 3+sumInts(3+1,5))
    计算结果为
  • 2+(3+消费(4,5))
  • 2+(3+(如果(4>5)0其他4+消耗(4+1,5))
    计算结果为
  • 2+(3+(4+消费(5,5))
  • 2+(3+(4+(如果(5>5)0其他5+消费(5+1,5))
    计算结果为
  • 2+(3+(4+(5+消费(6,5)))
  • 2+(3+(4+(5+)(如果(6>5)0其他6+消耗(6+1,5щщ)
    ,条件为
    true
    ,计算结果为
  • 2+(3+(4+(5+(0))

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

    [Update]在Scala中,
    return
    语句是可选的;函数返回最后计算的表达式的值。因此,上述功能体相当于

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

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

  • if(2>5)0 else 2+sumInts(2+1,5)
    条件为
    false
    ,计算结果为
  • 2+消费(3,5)
  • 2+(如果(3>5)0 else 3+sumInts(3+1,5))
    计算结果为
  • 2+(3+消费(4,5))
  • 2+(3+(如果(4>5)0其他4+消耗(4+1,5))
    计算结果为
  • 2+(3+(4+消费(5,5))
  • 2+(3+(4+(如果(5>5)0其他5+消费(5+1,5))
    计算结果为
  • 2+(3+(4+(5+消费(6,5)))
  • 2+(3+(4+(5+)(如果(6>5)0其他6+消耗(6+1,5щщ)
    ,条件为
    true
    ,计算结果为
  • 2+(3+(4+(5+(0))

  • 谢谢,我还遗漏了一点,即“a”变量在随后的每次调用中都是递增的。注意这个断言,
    a
    实际上从未“更新”,更正确的说法是,对于每次递归调用,该方法都会使用不同的参数值调用,但是
    a
    在每次递归过程中都保持不变。谢谢,我还遗漏了一点,那就是“a”变量在每次后续调用中都是递增的。注意这个断言,
    a
    实际上从来没有“更新过”,更正确的说法是,对于每次递归调用,使用不同的参数值调用该方法,但
    a
    在每次递归期间保持不变。