斐波那契数列变形

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

   解析:对于一般情况,把n级台阶的跳法看成是n的函数,记为f(n)。当n>2时,第一次跳的时候就有两种不同的选择:一是第一次只跳1级,此时跳法数目等于后面剩下的n-1级台阶的跳法数目,记为f(n-1);另外一种是第一次跳2级,此时跳法的数目等于垢面剩下的n-2级台阶的跳法数目,记为f(n-2)。因此n级台阶的跳法数目f(n)=f(n-1)+f(n-2)。代码和斐波那契数列的代码相同,非递归实现如下。

#include<iostream>

long long Fibonacci(unsigned int n){
   if(n<=2)
    return n-1;

   long long fibNumberOne = 1;
   long long fibNumberTwo = 0;
   long long fibN = 0;
   for(unsigned int i = 2;i < n;i++){
        fibN = fibNumberOne + fibNumberTwo;
        fibNumberTwo = fibNumberOne;
        fibNumberOne = fibN;
   }
   return fibN;
}

int main(){
    unsigned int fiboNumber;
    while(std::cin>>fiboNumber){
        std::cout<<Fibonacci(fiboNumber)<<std::endl;
    }
    return 0;
}
View Code

   同理如果青蛙一次可以跳1级、2级...n级等等,那么跳法的数目f(n)=f(n-1)+f(n-2)+f(n-3)+...+f(n),数学归纳法可证为f(n)=2^(n-1),以此类推。同理对于部分小矩形覆盖大矩形的问题也可以转换成斐波那契数列类的问题。

 

posted @ 2016-08-16 10:42  没长大的书生  阅读(332)  评论(0编辑  收藏  举报