经典算法之斐波那契数列

经典算法


前言

就算法而言,我们主要学习的是数学+思维+逻辑+数据结构实现功能,所以我们主要学习是思维也是解决问题的思路,然后用逻辑去实现它。


提示:以下是本篇文章正文内容,下面案例可供参考

一、什么是斐波那契数列?

百度一下:斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从 1963 年起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。

二、实现代码

也就是说 0 1 1 2 3 5…这样累加然后取指定项的结果集
下面分别介绍3种实现方式,注意好好分析这3种的逻辑。

1.数组写法

public class 斐波那契数列 {
    
    
    public static void main(String[] args) throws Exception {
    
    
        int[] a=new int[20];
        //数据19位值的数据,也就是20项的结果
         fun1(a);
    }
    /**
     * 数组写法
     */
    public static  void fun1(int[] a){
    
    
        a[0]=1;
        a[1]=1;
        for(int i=2;i<a.length;i++){
    
    
            a[i]=a[i-1]+a[i-2];
        }
        //打印结果
        System.out.println(a[a.length-1]);
    }
}

输出结果;
在这里插入图片描述

2.递归算法(牢记) 能够提高效率

public class 斐波那契数列 {
    
    
    public static void main(String[] args) throws Exception {
    
    
       int f = fun(30);
        System.out.println(f);
    }
    /**
     *递归算法(牢记)  能够提高效率
     *Functions:斐波那契数列: 1  1  2  3  5.....返回斐波那契数列的第20项数值
     */
    public static  int fun(int a) throws Exception {
    
    
        if(a==0){
    
    
            throw new Exception("参数异常错误");  //自定义异常
        }
        if(a==1||a==2) {
    
    
            return 1;
        }else{
    
    
            return fun(a-1)+fun(a-2);
        }
    }

}

输出结果:
在这里插入图片描述

2.前后倒置效率最高!!!!!(优先使用)

public class 斐波那契数列 {
    
    
    public static void main(String[] args) throws Exception {
    
    
        int f = fun2(35);
        System.out.println(f);
    }
    /**
     *效率最高!!!!!(优先使用)
     */
    public static int fun2(int n){
    
    
        if(n<=1) return n;
        int first=0;     //0位
        int second=1;     //1位
        for(int i=0;i<n-1;i++){
    
    
            int sum=first+second;   //求出数字值2=1+1
            first=second;       //然后将下角标的第2个位置,推到第一个位置,这样第二个位置就空出来了
            second=sum;         //然后将总和推到空出来的第二个位置,这样就是second的值了,也是我们要求的值
        }
        return second;
    }
}

输出结果:
在这里插入图片描述


总结

这三种都可实现 0 1 1 2 3 5…这样累加然后取指定项的结果逻辑,但是他们的思想是不一样的,也就是说解决问题的方式不一样,代码运行起来消耗CPU的资源也不一样,所以说这三种从资源消耗来讲是由高到低的,时间负责度是O(n)。

猜你喜欢

转载自blog.csdn.net/zhx__/article/details/119918111
今日推荐