题目描述:
写一个函数,输入 n
,求斐波那契(Fibonacci)数列的第 n
项(即 F(N)
)。斐波那契数列的定义如下:
F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
答案需取模
思路:
1)递归:由于重复的计算 之前的 数,造成时间复杂度很大;超出时间限制!递归法的时间复杂度为 O(2^N)
2)动态规划:就是动态改变下一次要用到的内容的值!?
韩顺平讲过,但是不记得了,学过的尚硅谷数据结构与算法 需要重新复习一下,基础知识需要学习!
手写代码:递归,直接错误!
class Solution {
public int fib(int n) {
return fibo(n);
}
//使用递归的方法
int fibo(int n){
//结束条件
if(n == 1 || n == 0) return n;
//具体的逻辑主体
return fibo(n - 1) + fibo(n - 2);
}
}
动态规划:感觉是和 递归相反的情况!递归往前计算了好多次!时间复杂度 O(N)
class Solution {
public int fib(int n) {
//b在前,a在后,每次把b往前移动一位!
int a = 0,b = 1,sum = 0; //a代表 n = 0; b代表 n=1
for(int i = 0;i < n;i++){
sum = (a + b) % 1000000007;//得到的是 n = 2时的值
//动态的更换 a 和 b的值
//sum、a、b、是一直挨着的三个
a = b;
b = sum;
}
//a才是记录当前 n的数值;b已经是记录下一个数值
return a;
}
}