You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scala递归函数recur执行步骤解析及疑问求证

Scala递归代码执行流程解析与疑问解答

咱们先把这段Scala代码整理成更易读的格式:

object MainObject {
  def main(args: Array[String]) {
    var result = recur(15,2)
    print(result)
  }

  def recur(a:Int,b:Int):Int={
    if(b==0) 0
    else a + recur(a,b-1)
  }
}

一、代码执行流程拆解

咱们跟着调用链条一步步走:

  1. 主函数启动:main方法里调用recur(15, 2),把结果赋值给result。
  2. 第一次递归调用:进入recur(15,2),此时b=2≠0,所以执行15 + recur(15, 2-1),也就是15 + recur(15,1)。这时候这个计算不会立刻完成,得等recur(15,1)的结果返回。
  3. 第二次递归调用:进入recur(15,1),b=1≠0,执行15 + recur(15,1-1),也就是15 + recur(15,0),同样要等内层调用的结果。
  4. 第三次递归调用:进入recur(15,0),此时b=0,触发if分支,直接返回0。
  5. 回溯计算结果:
    • 第二次调用的结果变成15 + 0 = 15,把这个值返回给第一次调用。
    • 第一次调用的结果变成15 + 15 = 30,把这个值返回给主函数。
  6. 最终输出:主函数里print(result)打印出30。

二、你的疑问解答

先明确两个点:

  • 你的第一个理解是对的:else分支里确实每次都会把b递减1后发起递归调用,从2→1→0的过程完全正确。
  • 为什么最终返回值不是0?:因为递归是「先递后归」的过程,第三次调用返回的0只是最内层的终止条件值,它会被上层的递归调用一步步累加。咱们可以把整个过程展开看:
    recur(15,2) = 15 + recur(15,1)
    recur(15,1) = 15 + recur(15,0)
    recur(15,0) = 0
    // 代入回去
    recur(15,1) = 15 + 0 =15
    recur(15,2)=15+15=30
    
    最内层的0只是用来结束递归的触发点,最终的结果是所有上层a的累加值,而不是这个终止值本身。

内容的提问来源于stack exchange,提问作者naveen kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:44:00