阅读 533

算法-斐波那契数列(斐波那契数列算法框图)

一、定义

斐波那契数列fib(n)又被称为黄金分割数列,该数列由0和1开始,通俗的说话就是后面的每个数字都是前两个数字相加之和。

例如:0,1,1,2,3,5,8,13,21,34,55,89……

一般可以使用递归、缓存、递推方式解算出来。同时斐波那契是有数学公式的,矩阵,位运算等这些方面的概念。

二、递归

var fib = function(N) {
    if(N == 1 || N == 0) {
        return N;
    }
    return fib(N-1) + fib(N-2);//递推公式
}复制代码

思路:

  • 当给你的N等于1或者等于0的时候直接输出

  • 否则就用递归的方式拿到N前一个数字和N前两个数字,然后计算出这两个数字相加之和就是当前的N。

使用递归的方法,输出数列的第N个数字,但是因为使用递归进行计算斐波那契会有大量重复的计算,这时可以使用数学公式加速。因为N是越来越大的,N的值越大,就更加可能造成内存溢出,或者计算时间长,和上图一样计算的速度很慢,虽然可以实现,但是只能适合0-30以内的数字。

三、递推

定义:递推算法是一种理想型思维模式的代表,根据已知的条件得出中间的结论,直到推出结果为止,递推算法还分为顺推和逆推两种。

  • 顺推:根据已知的条件,求出需要解决的结果。

  • 逆推:根据目前的问题,逐步求出条件。

递归和递推的区别:递推去掉了数据进出栈的过程,也就是不需要通过函数向边界值靠拢,而是反向来从边界值出,直到出函数值。所以递推的效率更高,但是递归也有一定的优势根据需求使用。

var fib = function(N) {
    let cache = [];
    for(let i = 0;i <= N;i++) {
        if(i == 1 || i == 0) {
            cache[i] = i;
        }else {
            cache[i] = cache[i-1]+cache[i-2]
        }        
    }
    return cache[N]
}复制代码

这个的复杂度是O(n),其实还可以通过数学公式优化的更好。

第一次写算法,如果有写的不好的地方不要说我啊,社恐……


作者:小鲸鱼mm
链接:https://juejin.cn/post/7033705205430665247


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐