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)
}
}
在上面的代码中,有人可以向我解释这是如何逐步执行的吗?
如果我错了,请纠正我:除此之外还有recur函数在每次迭代中调用recur(15,2)
吗?通过每次扣除?如果是,那么在第3次运行b
将为0,那么为什么它不返回0,如果变为真。
答案 0 :(得分:3)
几条评论。
1)由于结果的值只分配一次,因此它更加惯用,通常更倾向于使用val
代替var
。
2)此外,在Scala中,您可以在函数内定义函数,当您不希望将递归的行为暴露给更大的上下文时,这通常很有用。
3)考虑外部评估:
recur(15, 2)
返回15 + recur(15, 1)
recur(15, 1)
返回15 + recur(15, 0)
recur(15, 0)
返回0
现在替换:
recur(15, 1)
返回15 + 0
recur(15, 2)
返回15 + 15
或30
答案 1 :(得分:1)
将IMHO视觉化的最佳方式是“从外部”执行:
recur(15, 2)
,它将返回15 + recur(15, 1)
recur(15, 1)
- 它将返回15 + recur(15, 0)
。recur(15, 0)
,正如您所提到的,它会返回0
。15+0
或15
。15+15
或30
。答案 2 :(得分:0)
查看这一个的简单方法是将值归于计算的每个阶段,计算是倒退的:
For each step, the second parameter is reduced by 1 and the first stays the same.
At b = 0, the output is 0.
recur(15, 2) = 15 + recur(15, 1)
recur(15, 1) = 15 + recur(15, 0)
recur(15, 0) = 0
We know that recur(15, 0) = 0
recur(15, 1) == 15 + recur(15, 0) == 15 + 0 == 15
And because recur(15, 1) = 15
recur(15, 2) == 15 + recur(15, 1) == 15 + 15 == 30
所以recur(15, 2)
的答案是30.这样倒退对于更简单的函数非常有用,但是可以变得非常复杂,所以把它写出来就像我一样或在每个阶段记下输出所以你不要忘记你的计算。
...或者让编译器去做。要么有效。