题目:一只青蛙一次可以跳1级台阶,也可以跳2级台阶。请问该青蛙跳上一个n级台阶总共有多少种跳法。
分析:我们把n级台阶时的跳法看成是n的函数f(n),当n>2时,第一次跳的时候有两种选择,第一次跳1级,此时跳法数目等于后面剩下的n-1级台阶的跳法数目,即f(n-1);另外一种是第一次跳2级,此时跳法数目等于后面剩下的n-2级台阶的跳法数目,即f(n-2)。这样不难看出总跳法的数目f(n)=f(n-1)+f(n-2);f(1)=1,f(0)=0。这样就变成了斐波那契数列的求解。我们可以用递归直接实现如下:
long long Fibonacci(unsigned int n){ if(n<=0) return 0; if(n=1) return 1; return Fibonacci(n-1)+Fibonacci(n-2);}
但是问题来了:上述递归算法有很严重的效率问题。时间复杂度是以n的指数方式递增的。因此实际软件开发中是不会用此方法的。
由于上面的递归过程中有很多重复计算,所以只要除去这些重复计算我们的算法就会大大的优化。更简单的方法是从下往上计算,首先根据f(0)和f(1)计算出f(2),在根据f(1)和f(2)计算出f(3)...一次类推就会计算出f(n),时间复杂度是O(n).实现如下:
long long Fibonacci(unsigned int n){ int result[2]={0,1}; if(n<2) return result[n]; long long fibNMinusOne=1; long long fibNMinusTwo=0; long long fibN=0; for(unsigned int i=2;i<=n;i++) { fibN=fibNMinusOne+fibNMinusTwo; fibNMinusTwo=fibNMinusOne; fibNMinusOne=fibN; } return fibN;}