Fibonacci数列的两种计算方式

背景

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

递归方式


    /**
     * 递归求Fibonacci数列
     *
     * @param day
     * @return
     */
    public int fibonacci(int day) {
        if (day == 1 || day == 2) {
            return 1;
        } else {
            return fibonacci(day - 1) + fibonacci(day - 2);
        }
    }

缺点:由于每一次计算都要从第三天计算,重复了很多,时间复杂度也极高,称指数上升,天数越多,耗时越大

非递归求Fibonacci数列

思路:
这里写图片描述

/**
     * 非递归求斐波那契数列
     * @param day
     * @return
     */
    public int fibonacci2(int day) {
        int start = 1;
        int start1 = 1;
        int temp = 0;

        if (day == 1 || day == 2) {
            return 1;
        }
        for (int i = 2; i < day; i++) {
            temp = start + start1;
            start1 = start;
            start = temp;
        }
        return temp;
    }

时间复杂度为O(n);

猜你喜欢

转载自blog.csdn.net/tangyaya8/article/details/79802442