请使用原生的js实现斐波那契数列

function fibonacci(n) {
  if (n <= 0) {
    return 0;
  } else if (n === 1) {
    return 1;
  } else {
    let a = 0;
    let b = 1;
    let temp;
    for (let i = 2; i <= n; i++) {
      temp = a + b;
      a = b;
      b = temp;
    }
    return b;
  }
}


// 测试用例
console.log(fibonacci(0)); // 输出 0
console.log(fibonacci(1)); // 输出 1
console.log(fibonacci(2)); // 输出 1
console.log(fibonacci(3)); // 输出 2
console.log(fibonacci(10)); // 输出 55


// ---  以下为可选的优化方案 ---


// 使用递归 (注意性能问题,n较大时会栈溢出)
function fibonacciRecursive(n) {
  if (n <= 0) {
    return 0;
  } else if (n === 1) {
    return 1;
  } else {
    return fibonacciRecursive(n - 1) + fibonacciRecursive(n - 2);
  }
}



// 使用记忆化递归 (优化递归性能)
const memo = {};
function fibonacciMemoization(n) {
  if (n in memo) {
    return memo[n];
  }
  if (n <= 0) {
    return 0;
  } else if (n === 1) {
    return 1;
  } else {
    memo[n] = fibonacciMemoization(n - 1) + fibonacciMemoization(n - 2);
    return memo[n];
  }
}


// 使用数组存储 (避免重复计算,性能更好)
function fibonacciArray(n) {
  let fib = [0, 1];
  for (let i = 2; i <= n; i++) {
    fib[i] = fib[i - 1] + fib[i - 2];
  }
  return fib[n];
}


// 测试优化方案的性能 (需要引入性能测试库,例如benchmark.js)
//  ...


代码解释和说明:

  1. fibonacci(n) (迭代法): 这是最推荐的写法,因为它简洁、高效,并且不会出现递归的栈溢出问题。 使用循环迭代计算斐波那契数列,避免了重复计算。

  2. fibonacciRecursive(n) (递归法): 递归的写法简洁易懂,但对于较大的 n 值,会造成栈溢出,性能很差,不推荐在实际项目中使用。

  3. fibonacciMemoization(n) (记忆化递归): 通过 memo 对象缓存已经计算过的值,避免重复计算,解决了递归的性能问题。 虽然比纯递归好很多,但仍然不如迭代法高效。

  4. fibonacciArray(n) (数组存储法): 使用数组存储计算结果,避免重复计算,性能也很好,与迭代法接近。

如何选择:

  • 对于前端开发,绝大多数情况下,使用 fibonacci(n) (迭代法) 就足够了,因为它性能好,代码简洁。
  • 如果 n 的值非常大,可以考虑使用 fibonacciArray(n) (数组存储法)。
  • 避免使用 fibonacciRecursive(n) (纯递归),除非你非常清楚它的性能限制,并且 n 的值很小。

这个例子提供了多种实现方式,并解释了它们的优缺点,方便你根据实际情况选择最合适的方案。 记住,在前端开发中,性能非常重要,尽量选择高效的算法。

posted @   王铁柱6  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示