[剑指Offer学习] 面试题N7:斐波拉契数列

题目描述

题目描述: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39

规律发现

  • 思路:
    最简单的的想法是通过递归函数实现,但是递归函数存在严重的时间效率问题,当n增大时,时间复杂度以n的指数的方式递增。因此,这不是一个好的方法,递归方法之所以慢,是因为重复的计算太多,提升时间效率的方法是把已经的得到的中间项保存起来,在下次需要计算的时候先查找一下,如果前面已经计算过就不用再重复计算了。

完整代码展示

public class N7斐波那契数列 {
    public static long fibonacci(int n){
        //当输入非正整数的时候返回0
        if(n < 0)
            return 0;
        //输入1或者2的时候返回1
        int[] a={0,1};
        if(n < 2)
            return a[n];

        //记录第n-2的fibonacci数的值
        long FabOne = 0;
        //记录第n-1的fibonacci数的值
        long FabTwo = 1;
        //记录第n的fibonacci数的值
        long FabN = 1;

        //把递归的方法用循环实现
        for(int i=2;i<=n;i++){
            //求第i个fibonacci数的值
            FabN = FabOne + FabTwo;
            //更新记录的结果,源prePre原先记录第i-2个fibonacci数的值
            //现在记录第i-1个fibonacci数的值
            FabOne = FabTwo;
            //更新记录的结果,源pre原先记录第i-1个fibonacci数的值
            //现在记录第i个fibonacci数的值
            FabTwo = FabN;
        }
        //返回所求的结果
        return FabN;
    }

    //斐波拉契数列的递归写法
    public long fibonacci1(long n){
        long fabN = 0;
        if(n <= 0)
            fabN = 0;
        else if(n==1)
            fabN = 1;
        else
            fabN = fibonacci1(n-1) + fibonacci1(n-2);
        return fabN;
    }

    public static void main(String[] args) {
        N7斐波那契数列 f = new N7斐波那契数列();
        long x = f.fibonacci(38);
        long x1 = f.fibonacci1(38);
        System.out.println(x);
        System.out.println(x1);
    }

}

运行结果显示

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值