LeetCode509.斐波那契数 | 刷题打卡

205 阅读1分钟

题目描述

leetcode链接:leetcode-cn.com/problems/fi…

斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:

F(0) = 0,F(1) = 1 F(n) = F(n - 1) + F(n - 2),其中 n > 1 给你 n ,请计算 F(n) 。

思路描述

算法中的经典题目了。 我想到两种解法,分别是递归法和动态规划。

递归法

很明显满足递归法的条件,在函数中存在调用函数本身的情况,且最后有终止条件。 优点代码少,易理解,但是效率低。

动态规划

递归法之所以效率低,是因为对函数的相同值重新计算了好几遍。而动态规划法则建议,与其对交叠的子问题一次又一次地求解,还不如对每个较小的子问题只求解一次并把结果记录在表中。 自底向上,根据较小值获取到较大值的值,同时将运算过的值存储起来,避免重复运算。效率较高。但是因为要存储运算过的值,所以占的空间会多一点。

AC代码

递归法:

/**
 * @param {number} n
 * @return {number}
 */
var fib = function(n) {
    if(n === 0) {
        return 0;
    }
    if (n === 1) {
        return 1;
    }
    return fib(n-1) + fib(n-2)
};

动态规划:

/**
 * @param {number} n
 * @return {number}
 */
var fib = function(n) {
    if(n === 0) {
        return 0;
    }
    if (n === 1) {
        return 1;
    }
    let a = 2;
    let tempA = 0;
    let tempB = 1;
    while (a !== n+1) {
        const temp = tempA + tempB;
        tempA = tempB;
        tempB = temp;
        a++;
    }
    return tempB;
};

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情