P73、面试题9:斐波那契数列

题目一:写一个函数,输入n,求斐波那契数列(Fibonacci)数列的第n项,斐波那契数列的定义如下: f(n) = {0  n = 0;  1   n = 1;  f(n-1)+f(n-2)  n>1}

题目二:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

即求斐波那契数列的f(n)的结果。

在青蛙跳台阶的问题中,如果把条件改成:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。。。。。它也可以跳上n级,此时该青蛙跳上一个n级的台阶总共有多少种跳法?我们用数学归纳可以证明f(n)=2的n-1次方。

解法一fibonacci_1(效率低下),解法二fibonacci_2(时间复杂度为n)

package com.yyq;

/**
 * Created by Administrator on 2015/9/10.
 */
public class Fibonacci {
    public static long fibonacci_1(int n){
        if(n <= 0) return 0;
        if(n == 1) return 1;
        return fibonacci_1(n - 1) + fibonacci_1( n - 2);

    }

    public static long fibonacci_2(int n){
        if(n <= 0) return 0;
        int result[] = {0,1};
        long fibOne = result[0];
        long fibTwo = result[1];
        long temp = 0;
        if(n <2){
            return result[n];
        }
        for(int i = 2; i <= n; i++) {
            temp = fibOne + fibTwo;
            fibOne = fibTwo;
            fibTwo = temp;
        }
        return temp;
    }

    // ====================测试代码====================
    public static void Test(int n, int expected)
    {
        if(fibonacci_1(n) == expected)
            System.out.println("Test for "+n+" in solution1 passed.");
        else
            System.out.println("Test for " + n + " in solution1 fail.");

        if(fibonacci_2(n) == expected)
            System.out.println("Test for " + n + " in solution2 passed.");
        else
            System.out.println("Test for " + n + " in solution2 fail.");
    }

    public static void main(String[] args){
        Test(0, 0);
        Test(1, 1);
        Test(2, 1);
        Test(3, 2);
        Test(4, 3);
        Test(5, 5);
        Test(6, 8);
        Test(7, 13);
        Test(8, 21);
        Test(9, 34);
        Test(10, 55);
        Test(40, 102334155);
    }
},
 
输出结果:
Test for 0 in solution1 passed.
Test for 0 in solution2 passed.
Test for 1 in solution1 passed.
Test for 1 in solution2 passed.
Test for 2 in solution1 passed.
Test for 2 in solution2 passed.
Test for 3 in solution1 passed.
Test for 3 in solution2 passed.
Test for 4 in solution1 passed.
Test for 4 in solution2 passed.
Test for 5 in solution1 passed.
Test for 5 in solution2 passed.
Test for 6 in solution1 passed.
Test for 6 in solution2 passed.
Test for 7 in solution1 passed.
Test for 7 in solution2 passed.
Test for 8 in solution1 passed.
Test for 8 in solution2 passed.
Test for 9 in solution1 passed.
Test for 9 in solution2 passed.
Test for 10 in solution1 passed.
Test for 10 in solution2 passed.
Test for 40 in solution1 passed.
Test for 40 in solution2 passed.

 

posted @ 2015-10-28 18:58  我是一名老菜鸟  阅读(269)  评论(0编辑  收藏  举报