509. 斐波那契数

180 阅读1分钟

每日刷题第1天 2021.12.26

509.斐波那契数

  • 递归解法 简单题

分析:

  • 斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。该数列由01开始,后面的每一项数字都是前面两项数字的和。
  • 由上述👆可知,函数的停止条件是f(0) = 0,f(1) = 1,那么就可以使用递归
  • 递归:在一个函数中再次调用该函数自身的行为。

递归解法:

/**
 * @param {number} n
 * @return {number}
 */
var fib = function(n) {
  // 使用递归做法
  function fn (n) {
    if (n == 0) {
      return 0;
    }
    if (n == 1) {
      return 1;
    }
    return fn(n - 1) + fn(n - 2); 
  }
  return fn(n);
};

优化递归解法:

  • 在斐波那契数列中,如果f(n)n是一定的,无论多少次调用都会得到同样的结果。优化:计算一次后,用数列将结果存储起来。

斐波那契数列12-26.png

/**
 * @param {number} n
 * @return {number}
 */
var fib = function(n) {
  // 定义数组进行缓存已经计算过的f(n)的值
  let memo = new Array(33).fill(0);
  // 使用递归做法
  function fn (n) {
    if (n == 0) {
      return 0;
    }
    if (n == 1) {
      return 1;
    }
    // 判断之前是否计算过f(n)
    if (memo[n] != 0) {
        return memo[n];
    }
    return memo[n] = fn(n - 1) + fn(n - 2); 
  }
  return fn(n);
};

总结

  • 数组的fill()方法:用一个固定值填充一个数组中从起始索引到终止索引内的全部元素。不包括终止索引。
const array1 = [1, 2, 3, 4];

// fill with 0 from position 2 until position 4
console.log(array1.fill(0, 2, 4));
// expected output: [1, 2, 0, 0]

// fill with 5 from position 1
console.log(array1.fill(5, 1));
// expected output: [1, 5, 5, 5]

console.log(array1.fill(6));
// expected output: [6, 6, 6, 6]

附录

  • 加油💪