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

文章目录

    • 题目
    • 题解
      • 1. 递归法
      • 2. 优化递归
      • 3. 优化存储
      • 4. 继续改造

题目

大家都知道斐波那契数列,现在要求输入一个整数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);
    }

【剑指Offer题解:java】斐波阿契数列_第1张图片

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];
    }

【剑指Offer题解:java】斐波阿契数列_第2张图片

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

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;
    }

你可能感兴趣的:(算法,数据结构)