返回斐波那契数列第n项

返回斐波那契数列第n项

题目描述:返回斐波那契数列第n项
解体思路:
斐波那契数列:形如 0、1、1、2、3、5、8、13的数列
(第1项为0,第二项为1之后第n项为前两项的和)
解法1:使用递归求解
解法2:使用递归求解但开辟额外的空间用来存储已经求得斐波那契数
解法3:动态规划

class Solution {
 /*返回斐波那契数列第n项
  * */
 int[] fibonacciList = new int[100];
 public Solution() {
  // TODO Auto-generated constructor stub
  //初始化fibonacciList list[0]=0 list[1]=1 其余赋-1
  for(int i = 0; i < 100; i++) {
   this.fibonacciList[i] = -1;
  }
  this.fibonacciList[0]=0;
  this.fibonacciList[1]=1;
 }
    public int fib1(int n) {
     /*解法1:使用递归求解
      * */
     if (n == 1) {
   return 0;
  }else if(n == 2){
   return 1;
  }else {
   return fib1(n-1)+ fib1(n-2);
  }
    }
    
    public int fib2(int n) {
     /*解法2:在递归的基础上开辟额外空间已经求取的第x项
      * */
     if(fibonacciList[n-1] != -1) {
      return fibonacciList[n-1];
     }else {
      return fib2(n-2)+fib2(n-1);
     }
    }
    
    public int fib3(int n) {
     /*解法3:动态规划求解
      *确定状态:数列第n项的值
      *状态转移方程:fib_n = fib_(n-1) + fib_(n-2)
      *确定计算顺序:从0到n
      * */
     if(n == 1) {
      return 0;
     }else if(n == 2) {
      return 0;
     }else {
   int[] fiblist = new int[n];
   fiblist[0] = 0;
   fiblist[1] = 1;
   for(int i = 2; i < n; i++) {
    fiblist[i] = (fiblist[i-1] + fiblist[i-2]) % 1000000007;
   }
   if(fiblist[n-1] == 1000000008) return -1;
   return fiblist[n-1];
  }
    }
}

猜你喜欢

转载自blog.csdn.net/zfr143816/article/details/107769243
今日推荐