ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

【剑指Offer题解:java】斐波阿契数列

2021-01-21 13:03:29  阅读:131  来源: 互联网

标签:arr java 递归 int 题解 two 阿契 num return


文章目录

题目

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

题解

1. 递归法

斐波那契数列的标准公式为:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)

根据公式可以直接写出:

 /**
     * 方法一:只用递归处理
     *
     * @param n
     * @return
     */
    public static int Fibonacci(int n) {
        if (n == 0 || n == 1) return n;
        return Fibonacci(n - 1) + Fibonacci(n - 2);
    }

image.png

2. 优化递归

递归会重复计算大量相同数据,我们用个数组把结果存起来

/**
     * 方法二:由题意可以知道n<=39创建数组每次计算存下来即可
     *
     * @param n
     * @return
     */
    public static int Fibonacci2(int n) {
        if(n == 0)return 0;
        if(n == 1)return 1;
        int[] arr = new int[40];
        arr[0] = 0;
        arr[1] = 1;
        for (int i = 2; i <= n; i++) {
            arr[i] = arr[i - 1] + arr[i - 2];
        }
        return arr[n];
    }

image.png

运行时间减少了,但是内存依旧占用很大

3. 优化存储

可以发现每次就用到了最近的两个数,所以我们可以只存储最近的两个数

  • num 存储第 n 项的值
  • one 存储第 n-1 项的值
  • two 存储第 n-2 项的值
/**
     * 第二种方法占空间,继续优化
     *
     * @return
     */
    public static int Fibonacci3(int n) {
        if(n == 0)return 0;
        if(n == 1)return 1;
        int num = 0;//记录结果
        int one = 0;//第一个数
        int two = 1;//第二个数
        while ((n - 1) > 0) {
            num = one + two;
            one = two;
            two = num;
            n--;
        }
        return num;
    }

4. 继续改造

我们已知前两项的值,然后我们就可以用前两项的值求出第3项的值,接着求第4、第5、……,直到求出第n项的值。

public int Fibonacci4(int n) {
        if(n == 0)return 0;
        if(n == 1)return 1;
        int num = 1;//记录结果,也记录上一个数
        int one = 0;//第一个数
        while ((n - 1) > 0) {
            num = one + num;
            one = num - one;
            n--;
        }
        return num;
    }

标签:arr,java,递归,int,题解,two,阿契,num,return
来源: https://blog.csdn.net/qq_44895397/article/details/112927202

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有