备忘录

  1. // 斐波那契数列及其优化
  2. function fibonacci(n) {
  3. if (n < 1) throw new Error('参数错误');
  4. if (n === 1 || n === 2) return 1;
  5. return fibonacci(n - 1) + fibonacci(n - 2);
  6. }
  7. function memo(fn) {
  8. let obj = {};
  9. return function(n) {
  10. if (obj[n] === undefined) obj[n] = fn(n);
  11. return obj[n];
  12. }
  13. }

滚动数组方式

  1. const fibo = n => {
  2. // 判断输入的值是否有效,也可以抛出异常
  3. if (typeof n !== 'number' || !n) return 0;
  4. let arr = [1, 1];
  5. if (n > 2) {
  6. // 仅当n大于2时需要替换arr中的值
  7. // 循环的时候将上一次末尾的值替换掉头部的值,而尾部的值则等于上一次数组中两项之和
  8. for (let i = 3; i <= n; i++) arr = [arr[1], arr[0] + arr[1]];
  9. return arr[1]; // n项的值
  10. }
  11. return 1;
  12. }

3、斐波那契数列通项公式
斐波那契数列及其优化 - 图2

  1. let fib = n => Math.round(
  2. (Math.pow((1 + Math.sqrt(5)) / 2, n) -
  3. Math.pow((1 - Math.sqrt(5)) / 2, n)) /
  4. Math.sqrt(5)
  5. );

4、矩阵乘法 (高级)

  1. let fib=n=>
  2. n <= 0
  3. ? 0
  4. : martix22_mul(
  5. [[0, 1], [1, 0]],
  6. martix22_pow([[0, 1], [1, 1]], n - 1)
  7. )[0][1];
  8. let martix22_mul = (x, y) => [
  9. [
  10. x[0][0] * y[0][0] + x[0][1] * y[1][0],
  11. x[0][0] * y[0][1] + x[0][1] * y[1][1]
  12. ],
  13. [x[1][0] * y[0][0] + x[1][1] * y[1][0], x[1][0] * y[0][1] + x[1][1] * y[1][1]]
  14. ];
  15. let martix22_pow = (x, n) => {
  16. let r = [[1, 0], [0, 1]];
  17. let v = x;
  18. while (n) {
  19. if (n % 2 == 1) {
  20. r = martix22_mul(r, v);
  21. n -= 1;
  22. }
  23. v = martix22_mul(v, v);
  24. n = n / 2;
  25. }
  26. return r;
  27. };

推理过程:https://www.jianshu.com/p/adca358b6ec2