斐波那契数 (通常用 F(n)
表示)形成的序列称为 斐波那契数列 。该数列由 0
和 1
开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1
给定 n
,请计算 F(n)
。
示例 1:
输入:n = 2
输出:1
解释:F(2) = F(1) + F(0) = 1 + 0 = 1
示例 2:
输入:n = 3
输出:2
解释:F(3) = F(2) + F(1) = 1 + 1 = 2
示例 3:
输入:n = 4
输出:3
解释:F(4) = F(3) + F(2) = 2 + 1 = 3
提示:
0 <= n <= 30
今天学习了新的方法解决菲波那切数列,一般我们会通过递归的方式解决这个问题,但是我们知道递归应该谨慎使用,因为它非常容易造成Stack Overflow,并且如果通过当数据量变得大了之后,递归的速度也显得非常慢。所以今天我写了两种解决办法,一种是递归,另一种是O(n)的算法。
方法一:递归
var fib = function(n){
if(n===0)return 0;
if(n===1)return 1;
let current = 0;
return current = fib(n-2) + fib(n-1);
}
递归花费的时间
方法二:for循环
var fib2 = function(n) {
let p = 0,q = 1;//把f(0) f(1)赋值给两个变量,后边的数据都用这两个变量代替,只要n>1,p,q一次向前走一位就行了
if(n===0)return p;
if(n===1)return q;
let current;
for(let i = 2;i <= n;i++){
current = p + q;//1 2 3 5 8
p = q;//1 2 3 5
q = current;//1 2 3 5 8
}
return current;
};
使用for循环花费的时间:
递归使用1072ms,for循环使用了0.0058ms。