目 录
现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。
n<=39
题目解析
斐波那契数列是 0 1 1 2 3 5 8 13 21 …
解题方式很多,有递归方式,也有动归(迭代)方式,但是都是最简单的方式
- 迭代方案
根据斐波那契数列特性,每一项等于前两项之和,前三项是 0 1 1,然后定义前两项之后,通过迭代的方式进行计算后一项,也算是一种动态规划,此处循环条件值得注意,因为我们如果想求第三项,发现前两项是题目给了的,不需要求,所以通过 n > 2 ,n - -,的方式来从第三项开始求
public class Solution {
public int Fibonacci(int n) {
if(n == 0){
return 0;
}
int first = 1;
int second = 1;
int third = 1; //因为从0开始,third等于n就不用判定了
while(n > 2){
third = first + second;
first = second;
second = third;
--n;
}
return third;
}
}
- 递归方案
在上面的计算中并不算优,由于在斐波那契中通过二叉树的形式计算第 n 项存在大量重复计算,此时需要做出剪枝处理,优化速度
思路:我们可以弄一个容器,当我们每次计算出一个值的时候,就把他存到容器里,然后计算第 n 项的时候就在容器里去找前两项,没有就计算然后把值加入到容器里,可以有效在时间和空间上做到更完美
import java.util.HashMap;
import java.util.Map;
public class Solution {
private Map<Integer, Integer> filter = new HashMap<>();
public int Fibonacci(int n) {
if(n == 0 || n == 1){
return n;
}
// filter = new HashMap<>();
int pre = 0;
if(filter.containsKey(n-1)){
pre = filter.get(n-1);
}
else{
pre = Fibonacci(n-1);
filter.put(n-1, pre);
}
int ppre = 0;
if(filter.containsKey(n-2)){
ppre = filter.get(n-2);
}
else{
ppre = Fibonacci(n-2);
filter.put(n-2, ppre);
}
return pre + ppre;
}
}