你真的会斐波那契数列吗

斐波那契数列

https://www.nowcoder.com/practice/ee5d403c1172487f8c7915b3c3d924c6

const rl = require("readline").createInterface({ input: process.stdin });

rl.on('line', (line) => {
    const n = parseInt(line);
    const res = resolve3(n);
    console.log(res);
});

/**
 * 1. 递归的方式
 */
function resolve(n) {
    if(n <= 2) return 1;

    return resolve(n - 1) + resolve(n - 2);
}

/**
 * 2. 带备忘录的递归优化
 */

function resolve2(n) {
    const memory = Array(n+1).fill(0);

    const helper = (n, memory) => {

        if(n <= 2) return 1;

        if(memory[n] !== 0) return memory[n];
        

        memory[n] = helper(n - 1, memory) + helper(n - 2, memory);
        return memory[n];
    }

    return helper(n, memory);
}

/**
 * 3. dp 将递归转成迭代
 */

function resolve3(n) {
    const dp = Array(n + 1).fill(1);

    for(let i = 3; i <= n; i++) {
        dp[i] = dp[i - 1] + dp[i - 2];
    }

    return dp[n];
}

/**
 * 空间优化
 */
function resolve4(n) {
    if(n <= 2) return 1;

    let pre = 1, next = 1, res;

    for(let i = 3; i <= n; i++) {
        res = pre +  next;
        pre = next;
        next = res;
    }
    return res;
}

从斐波那契数列窥探动态规划

递归实现 -> 带备忘录的递归优化 -> 动态规划实现

动态规划的本质还是 穷举,将方式二的递归实现为迭代方式。状态转移方程是关键 dp[i] = dp[i-1] + dp[i - 2]

最后因为后续只用到前两个值,所以可以再把空间优化一下得到解法4。

全部评论

相关推荐

牛客410815733号:这是什么电影查看图片
点赞 评论 收藏
分享
头像
11-21 11:39
四川大学 Java
是红鸢啊:忘了还没结束,还有字节的5k 违约金
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务