求斐波那契数列的第N个数的值

难易程度 简单

题目描述:

Find the Nth number in Fibonacci sequence.(译:如题)

A Fibonacci sequence is defined as follow:
斐波那契数列的定义如下:

The first two numbers are 0 and 1.
数列的前两个数从0,1开始
The i th number is the sum of i-1 th number and i-2 th number.
后一个数的值等于前两个数的和

The first ten numbers in Fibonacci sequence is:
斐波那契数列的前十个数如下:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34 ...

Notice

The Nth fibonacci number won't exceed the max value of signed 32-bitinteger in the test cases.
测试用例中第N个斐波那契数列的值不会超过int的最大值(翻译可能不太准确哈...英语不好(⊙﹏⊙))

思路:

这道题非常耿直,比起青蛙跳阶梯,铺方砖等需要思考之后才能总结出可以使用斐波那契数列来结的算法,实在是面试中考算法的良心题目了。直接简明扼要的指出了是斐波那契数列,计算斐波那契数列常用的算法有两种:
递归
循环
好了,直接上代码:

public class Solution {

    //递归方式
    private static int fibonaccRecursion(int n) {

        if (n <= 1) {
            return 0;
        }
        if (n <= 2) {
            return 1;
        }
        return fibonaccRecursion(n - 1) + fibonaccRecursion(n - 2);
    }

    //循环方式求解
    private static int fibonaccLoop(int n) {

        if (n <= 1) {
            return 0;
        }
        if (n <= 2) {
            return 1;
        }

        //因为斐波那契数列是从0和1开始并在第三个数的时候才开始有规律
        int result = 0, a1 = 0, a2 = 1;
        for (int i = 3; i <= n; i++) {
            result = a1 + a2;
            a1 = a2;
            a2 = result;
        }
        return result;
    }

    public static void main(String[] args) {
        int n = 100;

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("mm:ss:SSS");

        System.out.println("递归开始执行 : " + simpleDateFormat.format(new Date()));
        int resultOne = fibonaccRecursion(n);
        System.out.println("递归执行完毕 : " + simpleDateFormat.format(new Date()));

        System.out.println("循环开始执行 : " + simpleDateFormat.format(new Date()));
        int resultTwo = fibonaccLoop(n);
        System.out.println("循环执行完毕 : " + simpleDateFormat.format(new Date()));

        System.out.print("resultOne : " + resultOne + " resultTwo : " + resultTwo);
    }
}

递归算法虽然代码简洁易懂,但是执行的效率比循环的方式要低很多,尤其是n值比较大的时候,所以不建议使用递归算法。

Ok,这个斐波那契数列系列算法中最简单的一道题已经分析完毕,让我们再接再厉,继续往更深的坑里跳吧~(手动滑稽)

点赞