剑指offer_10_斐波那契数列【javascript】

49 阅读1分钟

题目

写一个函数,输入 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)。