【每周一算】斐波那契数列FibonacciSequence

以下来自百度百科:斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递推的方法定义:F(1)=1,F(2)=2, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用。

代码如下:

package com.jandmin.demo.leetcode;

import com.alibaba.fastjson.JSONObject;

/**
 * @description: 斐波那契数列
 *      斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,
 *      故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,
 *      斐波纳契数列以如下被以递推的方法定义:F(1)=1,F(2)=2, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)
 *      在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用
 * @author: JandMin
 * @create: 2019-06-18 09:12
 **/
public class FibonacciSequence {
    public static void main(String[] args) {
        int n = 10;
        // 获取第n项数
        long start = System.currentTimeMillis();
        int num = getSequenceNum(n);
        System.out.print(num);
        System.out.println(" --> 耗时:" + (System.currentTimeMillis() - start) + " ms ");
        // 获取前n项集合
        start = System.currentTimeMillis();
        int[] array = getSequence(n);
        System.out.print(JSONObject.toJSONString(array));
        System.out.println(" --> 耗时:" + (System.currentTimeMillis() - start) + " ms ");
        start = System.currentTimeMillis();
        int[] sequence = getFibonacciSequence(n);
        System.out.print(JSONObject.toJSONString(sequence));
        System.out.println(" --> 耗时:" + (System.currentTimeMillis() - start) + " ms ");
    }

    /**
     * @Description: 获取前n项的数列
     * @Date: 2019/6/26
     * @param n
     * @return: int[]
     */
    private static int[] getFibonacciSequence(int n) {
        int[] array = new int[n];
        for(int i=0; i<n; i++){
            if(i <= 1){
                array[i] = 1;
            } else {
                array[i] = array[i-1] + array[i-2];
            }
        }
        return array;
    }

    /**
     * @Description: 获取前n项的数列
     * @Date: 2019/6/26
     * @param n
     * @return: int[]
     */
    private static int[] getSequence(int n) {
        int[] array = new int[n];
        for(int i=0; i<n; i++){
            array[i] = getSequenceNum(i+1);
        }
        return array;
    }

    /**
     * @Description: 返回第n项的值
     * @Date: 2019/6/26
     * @param n
     * @return: int
     */
    private static int getSequenceNum(int n) {
        if(n <= 2){
            return 1;
        }
        return getSequenceNum(n-1) + getSequenceNum(n-2);
    }
}

输出结果如下:

55 --> 耗时:0 ms 
[1,1,2,3,5,8,13,21,34,55] --> 耗时:157 ms 
[1,1,2,3,5,8,13,21,34,55] --> 耗时:0 ms 

猜你喜欢

转载自blog.csdn.net/ItRuler/article/details/93719040