斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368……
特别指出:第0项是0,第1项是第一个1。
第一种方法:递归
public static int Fibonacci(int n) {
if(n == 0) {
return 0;
}
if(n == 1) {
return 1;
}
return Fibonacci(n-1) + Fibonacci(n-2);
}
第二种方法:带备忘录的递归算法
//使用哈希map,充当备忘录的作用
static Map<Integer, Integer> tempMap = new HashMap();
public static int Fibonacci(int n) {
// n = 0 也算1种
if (n == 0) {
return 0;
}
if (n == 1) {
return 1;
}
//先判断有没计算过,即看看备忘录有没有
if (tempMap.containsKey(n)) {
//备忘录有,即计算过,直接返回
return tempMap.get(n);
} else {
// 备忘录没有,即没有计算过,执行递归计算,并且把结果保存到备忘录map中,对1000000007取余(这个是leetcode题目规定的)
tempMap.put(n, (Fibonacci(n - 1) + Fibonacci(n - 2)) % 1000000007);
return tempMap.get(n);
}
}
第三种方法:动态规划
public static int Fibonacci(int n) {
if (n == 0) {
return 0;
}
if (n == 1) {
return 1;
}
int a = 0;
int b = 1;
int temp = 0;
for (int i = 2; i <= n; i++) {
temp = (a + b)% 1000000007;
a = b;
b = temp;
}
return temp;
}