编程题:斐波那契数列\青蛙跳台阶
斐波那契数列
又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)
斐波那契数列涉及动态规划的思想,可以说是最简单标准的动态规划问题。若将下标下标n抽象为时间状态,那么斐波那契数列n刻的状态与n-1和n-2时刻的状态相关。
/*斐波那契数列 n<=39*/ public int Fibonacci(int n) { /* 使用迭代,效率极差 if(n==0) return 0; if(n==1) return 1; return Fibonacci(n-1)+Fibonacci(n-2); */ /*使用循环*/ int a=0,b=1,c=1; if(n==0) return 0; if(n<3) return 1; for(int i=3;i<=n;i++){ b=c; a=c-a; c=a+b; } return c; }
跳台阶:
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
考察点:递归、动态规划、斐波那契数列
思路:
青蛙跳到第N个台阶的跳法与青蛙跳到第N-1和第N-2的跳法相关,是两者之和
解题:
设青蛙跳到第i个台阶的跳法为S[i]
当i=0,S[i]=0
当i=1,S[i] = 1
当i>=2,S[i] = S[i-1]+S[i-2]
/*青蛙跳台阶,可跳1阶或2阶,求跳到N阶的跳法有多少种*/ /*跳到N阶的跳法=跳到N-1的跳法+跳到N-2的跳法*/ /*类似斐波那契数*/ public int JumpFloor(int target) { /*//递归耗费时间,虽然是递归的思想,但是使用递归消耗时间 if(target<=2) return target; return JumpFloor(target-1)+JumpFloor(target-2); */ if(target<=2) return target; int a=1,b=2; for(int i=3;i<=target;i++){ b=a+b; a=b-a; } return b; }
当你深入了解,你就会发现世界如此广袤,而你对世界的了解则是如此浅薄,请永远保持谦卑的态度。