题目
写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:
F(0) = 0,
F(1) = 1,
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
题解
自底向上递归
var fib = function(N) {
if(N < 2) {
return N;
}
let n1 = 1, n2 = 0;
for(let i = 2; i <= N; i++) {
let temp = n1;
n1 = n1 + n2;
n2 = temp;
}
return n1;
};
复杂度分析
时间复杂度:O(N)。
空间复杂度:O(1)
记忆化自顶向下
var fib = function(N, memo = []) {
if(N <= 1) {
return N;
}
if(!memo[N]) {
memo[N] = fib(N-1) + fib(N - 2);
}
return memo[N];
};
时间复杂度:O(N)。
空间复杂度:O(N),内存中使用的堆栈大小。
记忆化自底向上
var fib = function(N) {
if(N <= 1) {
return N;
}
let cache = new Array(N + 1);
cache[1] = 1;
cache[0] = 0;
for (let i = 2; i <= N; i++) {
cache[i] = cache[i-1] + cache[i-2];
}
return cache[N];
};
时间复杂度:O(N)。 空间复杂度:O(N),使用了空间大小为 N 的数组
递归
检查整数 N,如果 N 小于等于 1,则返回 N。 否则,通过递归关系:F_{n} = F_{n-1} + F_{n-2}F n=Fn−1+Fn−2调用自身。 直到所有计算返回结果得到答案
var fib = function(N) {
if(N <= 1) {
return N;
}
return fib(N - 1) + fib(N - 2)
};
时间复杂度:O(2^N)。这是计算斐波那契数最慢的方法。因为它需要指数的时间。 空间复杂度:O(N)。