scala尾递归实现斐波那契数列(LeetCode509)

斐波那契数列形如1, 1, 2, 3, 5, 8...,即每个元素都是上两个元素之和,f(n) = f(n-1) + f(n-2)

思路:

  1. 初值:使用一对参数(a, b),a用来保存上一轮的结果,b用来计算并保存本轮的结果。(a, b) 为(上轮结果, 本轮结果). 初始为 a = 0, b = 1,原因见迭代过程的演示。
  2. 迭代:下一轮的a用于保存上一轮的结果(即上一轮的b),下一轮的b用来进行上两轮结果求和(上轮的a是上上轮的结果,上轮的b即是上轮的结果,即a+b为上两轮的结果之和)。即每轮使得(a1, b1) = (b0, a0 + b0)
  3. 递归终止条件:当递归到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)
    }
}

你可能感兴趣的:(scala尾递归实现斐波那契数列(LeetCode509))