返回斐波那契数列第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];
}
}
}