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) } }
一、代码执行流程拆解
咱们跟着调用链条一步步走:
- 主函数启动:
main方法里调用recur(15, 2),把结果赋值给result。 - 第一次递归调用:进入
recur(15,2),此时b=2≠0,所以执行15 + recur(15, 2-1),也就是15 + recur(15,1)。这时候这个计算不会立刻完成,得等recur(15,1)的结果返回。 - 第二次递归调用:进入
recur(15,1),b=1≠0,执行15 + recur(15,1-1),也就是15 + recur(15,0),同样要等内层调用的结果。 - 第三次递归调用:进入
recur(15,0),此时b=0,触发if分支,直接返回0。 - 回溯计算结果:
- 第二次调用的结果变成
15 + 0 = 15,把这个值返回给第一次调用。 - 第一次调用的结果变成
15 + 15 = 30,把这个值返回给主函数。
- 第二次调用的结果变成
- 最终输出:主函数里
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=300只是用来结束递归的触发点,最终的结果是所有上层a的累加值,而不是这个终止值本身。
内容的提问来源于stack exchange,提问作者naveen kumar
相关产品推荐
相关产品推荐

