算法二 斐波那契队列 三种解法

斐波那契数列的概念

斐波那契数列(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

斐波那契数列的三种解法

public class Fib {
    private static Map<Integer, Integer> map = new HashMap<>();

    /**
     * 使用递归 由于重复计算效率是最慢的
     */
    public static int fib(int n) {
        if (n < 2) {
            return n;
        }
        return fib(n - 1) + fib(n - 2);
    }

    /**
     * 使用递归加缓存 去除了重复计算 效率次之
     */
    public static int fib2(int n) {
        if (n < 2) {
            return n;
        }
        if (map.containsKey(n)) {
            return map.get(n);
        }
        int sum = fib2(n - 1) + fib(n - 2);
        map.put(n, sum);
        return sum;
    }

    /**
     * 使用非递归 效率最高
     */
    public static int fib3(int n) {
        if (n < 2) {
            return n;
        }
        int first = 0;
        int second = 1;
        int sum = 0;
        while (n-- >= 2) {
            sum = first + second;
            first = second;
            second = sum;
        }
        return second;
    }

    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        for (int i = 0; i < 100; i++) {
            if (fib(i) < 0) {
                System.out.println(i);
                break;
            }
            System.out.print(fib(i) + ",");
        }
        System.out.println();
        System.out.println("fib1耗时" + (System.currentTimeMillis() - start) + " ms");
        long start2 = System.currentTimeMillis();
        for (int i = 0; i < 100; i++) {
            if (fib2(i) < 0) {
                System.out.println(i);
                break;
            }
            System.out.print(fib2(i) + ",");
        }
        System.out.println();
        System.out.println("fib2耗时" + (System.currentTimeMillis() - start2) + " ms");
        long start3 = System.currentTimeMillis();
        for (int i = 0; i < 100; i++) {
            if (fib3(i) < 0) {
                System.out.println(i);
                break;
            }
            System.out.print(fib3(i) + ",");
        }
        System.out.println();
        System.out.println("fib3耗时" + (System.currentTimeMillis() - start3) + " ms");
    }
}

结果
QQ截图20210526221104.png

总结

  1. 求斐波那契数列的值 使用递归的方法效率最低
  2. 求斐波那契数列的值 使用int类型时,在第47个数会发生溢出

LeetCode实战

写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:
F(0) = 0,   F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

示例 1:
输入:n = 2
输出:1

示例 2:
输入:n = 5
输出:5

提示:
0 <= n <= 100

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/fei-bo-na-qi-shu-lie-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

import java.util.Map;
import java.util.HashMap;
class Solution {
    private static Map<Integer, Integer> map = new HashMap<>();
    public int fib(int n) {
        if(n < 2){
            return n;
        }
        if(map.containsKey(n)){
            return map.get(n);
        }
        int sum = (fib(n - 1) + fib(n - 2)) % 1000000007; 
        map.put(n, sum);
        return sum;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值