斐波那契数列形如1, 1, 2, 3, 5, 8...,即每个元素都是上两个元素之和,f(n) = f(n-1) + f(n-2)
思路:
- 初值:使用一对参数(a, b),a用来保存上一轮的结果,b用来计算并保存本轮的结果。(a, b) 为(上轮结果, 本轮结果). 初始为 a = 0, b = 1,原因见迭代过程的演示。
- 迭代:下一轮的a用于保存上一轮的结果(即上一轮的b),下一轮的b用来进行上两轮结果求和(上轮的a是上上轮的结果,上轮的b即是上轮的结果,即a+b为上两轮的结果之和)。即每轮使得(a1, b1) = (b0, a0 + b0)
- 递归终止条件:当递归到k == 1时就可以输出结果b了
迭代的过程为:
数列 (a, b) (上轮结果, 本轮结果)
1 (0, 1)
1 (1, 1)
2 (1, 2)
3 (2, 3)
5 (3, 5)
... ...
使用尾递归,会被转为循环,不用担心栈溢出问题
ps: 可以在IDE里fib和run之间加上@annotation.tailrec注解测试是否正确的使用了尾递归
代码如下:
object Solution {
def fib(N: Int): Int = {
def run(k: Int, a: Int, b: Int): Int =
if (k == 0) 0
else if (k == 1) b
else run(k-1, b, a+b)
run(N, 0, 1)
}
}