剑指 Offer 10- I. 斐波那契数列
写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:
F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
示例 1:
输入: n = 2
输出: 1
示例 2:
输入: n = 5
输出: 5
提示:
- 链表中节点的数目在范围
[0, 1000]
0 <= Node.val <= 1000
1 <= k <= 50
递归
思路
我们知道斐波那契数列的规则就是
F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2)
所以往后的第n位的值就等于前两位值之和,即n-1和n-2位置上的两数之和
这里我们可以直接用递归暴力破解,
- 首先判断边界条件0和1的位置上面,我们直接返回
- 其它位置上的值我们可以再次调用fib方法请求fib(n-1)和fib(n-2)的和
var fib = function (n) {
if(n===0) return 0
if(n===1) return 1
return fib(n-1)+fib(n-2)
};
动态规划
思路
动态规划来做这道题效率跟高一些,一起看一下吧
因为我们每次计算都是前两个值相加得到,所以我们可以用两个变量p和q来保存。
为了方便计算,我们再声明一个当前变量curr,表示当前位置上的值。
- 边界条件:就是在0位置上直接返回0,在1位置上直接返回1
- 接下来n至少从2开始了,所以我们设置index为2
- 只要index还不===n那么就不断循环,每次我们获取到当前curr的值为(p+q)%1000000007 取余,然后p = q;q=curr;接着让index++
那么到最后刚好index===n的时候,此时curr就是n位上的值,直接返回curr
var fib = function (n) {
var m = 1000000007
var p = 0
var q = 1
var curr
if(n===0) return 0
if(n===1) return 1
var index = 2
while (index <= n) {
curr = (p+q) % m
p = q
q = curr
index++
}
return curr
};