【剑指 offer】斐波那契数列

目 录

现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。

n<=39

题目解析
斐波那契数列是 0 1 1 2 3 5 8 13 21 …
解题方式很多,有递归方式,也有动归(迭代)方式,但是都是最简单的方式

  1. 迭代方案

根据斐波那契数列特性,每一项等于前两项之和,前三项是 0 1 1,然后定义前两项之后,通过迭代的方式进行计算后一项,也算是一种动态规划,此处循环条件值得注意,因为我们如果想求第三项,发现前两项是题目给了的,不需要求,所以通过 n > 2 ,n - -,的方式来从第三项开始求

public class Solution { 
    public int Fibonacci(int n) { 
        if(n == 0){ 
            return 0; 
        } 
        int first = 1; 
        int second = 1; 
        int third = 1; //因为从0开始,third等于n就不用判定了 
        while(n > 2){ 
            third = first + second; 
            first = second; 
            second = third; 
            --n; 
        } 
        return third; 
    } 
} 
  1. 递归方案

在上面的计算中并不算优,由于在斐波那契中通过二叉树的形式计算第 n 项存在大量重复计算,此时需要做出剪枝处理,优化速度

思路:我们可以弄一个容器,当我们每次计算出一个值的时候,就把他存到容器里,然后计算第 n 项的时候就在容器里去找前两项,没有就计算然后把值加入到容器里,可以有效在时间和空间上做到更完美

import java.util.HashMap; 
import java.util.Map; 
public class Solution { 
    private Map<Integer, Integer> filter = new HashMap<>(); 
    public int Fibonacci(int n) { 
        if(n == 0 || n == 1){ 
            return n; 
        } 
      //  filter = new HashMap<>(); 
        int pre = 0; 
        if(filter.containsKey(n-1)){ 
            pre = filter.get(n-1); 
        } 
        else{ 
            pre = Fibonacci(n-1); 
            filter.put(n-1, pre); 
        } 
        int ppre = 0; 
        if(filter.containsKey(n-2)){ 
            ppre = filter.get(n-2); 
        } 
        else{ 
            ppre = Fibonacci(n-2); 
            filter.put(n-2, ppre); 
        } 
        return pre + ppre; 
    } 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Redamancy丶早晚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值