编程题:斐波那契数列青蛙跳台阶

斐波那契数列

又称黄金分割数列,因数学家莱昂纳多·斐波那契(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)(≥ 2,∈ 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;

}
当你深入了解,你就会发现世界如此广袤,而你对世界的了解则是如此浅薄,请永远保持谦卑的态度。
原文地址:https://www.cnblogs.com/liwxmyself/p/14698985.html