关于斐波那契那些事

动态规划之斐波那契数列

这是动态规划中一个非常经典的问题

求斐波那契额数列第n项的数(第0项为0 第1项为1)

写出该数列 0 1 1 2 3 5 8 ...

不难得出结论 f(n) = f(n-1) + f(n-2)

动态规划只考虑当前状态下的值 所以我们可以用递归的形式写出该算法

function feibo(n) {
    if(n < 2) return n;
    return feibo(n - 1) + feibo(n - 2);
}

对 就这么简单 当然很多情况下 有些在线编程环境会认为 这样会越栈
所以我们也可以按照状态来写

function feibo2(n) {
    if(n < 2) return n;
    var first = 0;
    var second = 1;
    var third;
    for(var i = 2; i <= n; i ++) {
        third = first + second;
        first = second;
        second = third;
    }
    return third;
}
// console.log(feibo2(6));

随着时代的变迁 现在基本上不会直接考这个斐波那契数列了 顶多是考考大一的新手

但是根据斐波那契额数列衍生出了一系列的问题 变着法考斐波那契

比如最经典的一个问题

青蛙跳台阶问题

一个青蛙最远跳1个或2个台阶 请问青蛙跳到第n级台阶有几种跳法?

这个问题似乎很棘手,但是一顿分析以后我们可以得出几个结论

当青蛙最后一跳时,他一定在n-1或者n-2个台阶上

青蛙跳到第n个台阶的跳法一定是青蛙跳到n-1个台阶的跳法加上n-2个台阶的跳法

简单的说 f(n) = f(n-1) + f(n-2) 而这就是斐波那契的通项公式

所以我们不难写出算法

    function jump(n) {
        if(n <= 2) return n;
        return jump(n - 1) + jump(n - 2);
    }
    console.log(jump(4));

相信这个问题还是难不住大多数coder的,所以在该问题上衍生出一个更复杂的问题

变态青蛙跳台阶问题

一个青蛙可以跳任意阶的台阶,请问他跳上n级台阶有多少种跳法

根据上面的分析过程 我们依旧可以得出通项公式 f(n) = f(n-1) + f(n-2) + ··· + f(2) + f(1) + f(0)

这个问题复杂度确实上升了 但是也很简单

    function jump2(n) {
        if(n <= 2) return n;
        var result = 0;
        for(var i = 1; i < n; i ++) {
            result += jump2(n - i);
        }
        return result + 1;
    }
    console.log(jump2(5));

是不是很简单 关于动态规划的题呢 要多练多做题才行 这是一种思想

加油叭

全部评论

相关推荐

牛客85811352...:1希音不知道算不算大厂 2完全符合,过得很舒服, 3确实只有杂活 领导找我续签到明年3、4月我要继续吗。主要是边实习边秋招这段时间还是有点累
什么是优秀的实习经历
点赞 评论 收藏
分享
11-13 14:37
门头沟学院 Java
程序员牛肉:是的,我觉得你最先需要的是多接触计算机圈子。我感觉你这个写的太幼稚了,根本没换位思考面试官。 你对实习的描述还是我写了前后端,我写了Restful接口,我用了EChatrs。你这让面试官怎么问你?问你什么是前后端?问你什么是Restful?讲真的兄弟,你这个简历在面试官眼里就是啥也不懂的好学生。所以一定要尽快加入一个圈子跟大家多聊聊,看看正儿八经的简历是怎么写的。 可以看一下我首页的简历怎么写那篇文章来学一下,你这里面的坑点我那篇文章里面都有讲过。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务