9 斐波那契数列Fibonacci

题目1:写一个函数,输入n,求Fibonacci数列的第n项。该数列定义如下:

n=0时,f(n)=0;        

n=1时,f(n)=1;        

n>1时,f(n)=f(n-1)+f(n-2)

1、 效率差的递归算法:时间复杂度以n的指数的方式递增。因为求f(10)=f(9)+f(8);f(9)=f(8)+f(7);f(8)=f(7)+f(6);可以看出有很多项是重复计算的。

//斐波那契数列,递归。通过测试
//f(0)=0,f(1)=1,f(n)=f(n-1)+f(n-2)
public class Fibonacci{
    public static void main(String[] args){
        System.out.println(fibonacci(8));
    }
    public static int fibonacci(int n){
        if(n<=0){//此处避免无法处理n<0的情况!!!
            return 0;
        }
        if(n==1){
            return 1;
        }
        return fibonacci(n-1)+fibonacci(n-2);
        }
}

    

 

2、进一步改进,非递归算法(时间复杂度O(n))

 

//斐波那契数列,非递归。通过测试
//f(0)=0,f(1)=1,f(n)=f(n-1)+f(n-2)
public class Fibonacci{
    public static void main(String[] args){
        System.out.println(fibonacci(2));
    }
    public static int fibonacci(int n){
        if(n<=0){//此处避免无法处理n<0的情况!!!
            return 0;
        }
        if(n==1){
            return 1;
        }
        int minusOne = 1;
        int minusTwo = 0;
        int fibN = 0;
        for(int i = 2; i<=n; i++){
            fibN = minusOne + minusTwo;             
            minusTwo = minusOne;
            minusOne = fibN;
        }
        return fibN;
    }
}

    

 

 

 

 题目2:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶共多少种跳法。答案:斐波那契数列f(n)=f(n-1)+f(n-2)

 题目3:一只青蛙一次可以跳上1级台阶,也可以跳上2级……也可以跳上n级。求该青蛙跳上一个n级的台阶共多少种跳法。答案:数学归纳法可得f(n)=2n-1

 题目4:可以用2*1(单位:cm)的小矩形横着或者竖着去覆盖更大的矩形。请问8个2*1的小矩形无重叠覆盖一个2*8的大矩形,共有多少中方法?

    答案:f(8)=f(7)+f(6),依然是斐波那契数列问题。

posted @ 2014-04-16 22:14  seven7seven  阅读(277)  评论(0编辑  收藏  举报