leetcode-509. 斐波那契数

130 阅读2分钟
/**
 * ref:https://leetcode-cn.com/problems/fibonacci-number/
 * 斐波那契数,通常用F(n)表示,形成的序列称为斐波那契数列。
 * 该数列由0和1开始,后面的每一项数字都是前面两项数字的和。也就是:
 * F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2),其中n>1,给你n,请计算F(n)。
 * 输入:10
 * 输出:55
 * 解释:F(10)=F(9)+F(8)+...+F(1)+F(0)=55
 */
public class FibonacciNumber {

    public static void main(String[] args){
        System.out.println(forceRecursion(10));
        System.out.println(memoryRecursion(10));
        System.out.println(iterate(10));
    }

    /**
     * 暴力递归方法
     * 当num=0,则输出0。当num=1,则输出1。其他值通过递归计算得出
     * @param num
     * @return
     */
    public static int forceRecursion(int num) {
        if(num==0) {
            return 0;
        }
        if(num==1) {
            return 1;
        }
        return forceRecursion(num-1)+forceRecursion(num-2);
    }

    /**
     * 记忆递归方法
     * 当num=0,则输出0。当num=1,则输出1。
     * 其他值在计算之前,先进行一次查询(通过下标在暂存数组中查找值是否为0,不是0则表示之前已经计算过),
     * 如果查询不到,则通过递归计算,并将结果暂存到数组中。
     * @param num
     * @return
     */
    public static int memoryRecursion(int num) {
        // 暂存之前的计算结果,数据是从0~num,因此数组长度是num+1
        int[] memoryData = new int[num+1];
        if(num==0) {
            return 0;
        }
        if(num==1) {
            return 1;
        }
        if(memoryData[num]!=0) {return memoryData[num];}
        return memoryData[num] = memoryRecursion(num-1)+memoryRecursion(num-2);
    }

    /**
     * 迭代方进行计算,由于计算F(N)=F(N-1)+F(N-2)。
     * 因此可以通过迭代然来记录迭代索引之前的两个值计算的结果,然后直接累加就是所求的值。
     * 定义两个变量,分别用来保存要计算下标值的前一个元素first,和前前一个元素second。
     * 每迭代一次,sum=first+second;second=first;first=sum;最终返回sum即可
     * @param num
     * @return
     */
    public static int iterate(int num) {
        if(num==0) {
            return 0;
        }
        if(num==1) {
            return 1;
        }
        int first = 1;
        int second = 0;
        int sum = 0;
        for(int i=2;i<=num;i++){
            sum = first + second;
            second = first;
            first = sum;
        }
        return sum;
    }

}