定义:斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、…… 在数学上,斐波纳契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)。
题目一:
写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项。
- 递归解法(效率很低):
1 | function fibonacci_sol1(n){ |
- 循环解法:
大概思路:首先根据f(0)和f(1)算出f(2),再根据f(1)和f(2)算出f(3)…… 依此类推就可以算出第n项了。很容易理解,这种思路的时间复杂度是o(n)。实现代码如下:
1 | function fibonacci_sol2(n){ |
题目二:
一只青蛙一次可以跳上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)。分析到这里,不难看出这实际上就是斐波那契数列了。
与斐波那契数列不同的是,其初始值定义稍有不同,
当n=1时,只能跳一级台阶,一种跳法
当n=2时,一次跳一级或两级,两种跳法
所以,关于青蛙跳台阶的定义如下:
1 | f(1) = 1; |
- 非递归写法:
1 | function frogJump12Step(n){ |
- 递归解法
1 | fcuntion frogJump12StepRecursive(int n){ |