每日一题:斐波那契数

164 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

leetcode第509题:斐波那契数。

斐波那契数列:[0,1,1,2,3,5,8,......]。数列特征是前两项的0和1,再后面每一项是前两项之和。

一、题目描述:

斐波那契数通常表示为F(n),由斐波那契数形成的序列称为斐波那契数列。n为第n项,F(n)为第n项是斐波那契数值。给定n求F(n)。也就是:

F(0) = 0F(1) = 1
F(n) = F(n - 1) + F(n - 2) // 其中 n > 1

示例1:

输入n=2 -> 输出1

解释:F(2) = F(1) + F(0) = 1 + 0 = 1

示例 3:

输入:n = 4 -> 输出:3 解释:F(4) = F(3) + F(2) = 2 + 1 = 3

二、思路解析:

方法①:递归求值

直接使用递归方式:根据关系公式F(n) = F(n - 1) + F(n - 2)一步步往前递归至初始值0和1时计算出F(n)

方法②:缓存+递推

我们对n进行循环遍历,每次循环求出当前项的值,使用缓存来记录每一项的斐波那契数,递推出当n时直接拿前两项的值相加

三、代码

/**
 * @param {number} n
 * @return {number}
 */
var fib = function(n) {
    // 方法一:递归
	if (n==0||n==1){
        return n;
    }
    return fib(n-1)+fib(n-2);
    
    // 方法二:缓存+递归
    let cache = []
    for(let i=0;i<=n;i++){
        if (i==0||i==1) {
            cache[i]=i
        } else {
            cache[i] = cache[i-1]+cache[i-2]
        }
    }
    return cache[n];
};

四:总结

  1. 直接使用递归来解题,虽然思路简单,但是涉及的计算量是很大的。
  2. 当使用方法二时,我们只对输入的数值n进行一遍循环,把每次的斐波那契数都存下来,当n项的时候我们自然可以直接取前两项求和了。只进行了一遍循环操作,时间复杂度为0(n)。