首页 > 其他分享 >请使用原生的js实现斐波那契数列

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

时间:2024-11-26 11:16:13浏览次数:8  
标签:递归 性能 js 斐波 fibonacci 使用 那契 迭代法

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 的值很小。

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

标签:递归,性能,js,斐波,fibonacci,使用,那契,迭代法
From: https://www.cnblogs.com/ai888/p/18569731

相关文章

  • 使用js实现摩斯密码的加密和解密
    constmorseCodeMap={'A':'.-','B':'-...','C':'-.-.','D':'-..','E':'.','F':'..-.','G':'--.',......
  • 请为什么说js是单线程,而不是多线程呢?
    JavaScript的单线程性质主要源于其最初的设计目标:操作浏览器中的DOM(文档对象模型)。如果JavaScript是多线程的,并且多个线程同时尝试修改DOM,就可能会出现竞态条件,导致DOM处于不一致或损坏的状态。想象一下,一个线程试图添加一个元素,而另一个线程同时试图删除同一个元素的父元素,这会导......
  • 说说用原生js实现封装一个选项卡的功能
    functioncreateTabs(tabContainerId,contentContainerId){consttabContainer=document.getElementById(tabContainerId);constcontentContainer=document.getElementById(contentContainerId);consttabHeaders=tabContainer.querySelectorAll('[dat......
  • 【前端】Next.js 性能优化技巧,让你的网站速度提升 50%!
    前言在当今互联网时代,网站的加载速度和性能直接关系到用户的满意度和留存率。特别是在竞争激烈的市场环境中,即使是几秒钟的延迟也可能导致用户流失。Next.js作为一款广受好评的React框架,不仅提供了强大的开发工具和丰富的功能,还内置了许多性能优化机制,帮助开发者构建高......
  • HTML静态网页成品作业(HTML+CSS+JS)——动漫火影忍者网页设计制作(5个页面)
    ......
  • (免费源码)计算机毕业设计必学必看 万套实战程序手把手教学 java、python、php、node.js
    摘 要科技进步的飞速发展引起人们日常生活的巨大变化,电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流,人类发展的历史正进入一个新时代。在现实运用中,应用软件的工作规则和开发步骤,采用Java技术建设绿......
  • 什么是D3.js,有什么特点
    什么是D3.js?D3.js(Data-DrivenDocuments)是一个用于数据可视化的JavaScript库,由MikeBostock创建。D3.js基于Web标准(如HTML、SVG和CSS),允许开发者使用数据驱动的方式动态生成和操作文档。D3.js提供了大量的工具和函数,用于处理数据、创建图表、实现动画效果和交互功......
  • ThreeJs-03材质进阶
    一.uv贴图在3D计算机图形学中,UV映射是一种将2D纹理映射到3D模型表面的方法。在这里,“U”和“V”代表了2D纹理空间的坐标,这与2D笛卡尔坐标系统中的“X”和“Y”是类似的。在3D模型的每个顶点上,都会有一组对应的UV坐标,它们定义了3D模型在这个顶点上的表面应当对应纹理图像的哪个部......
  • Nuxt.js 应用中的 webpack:error 事件钩子
    title:Nuxt.js应用中的webpack:error事件钩子date:2024/11/25updated:2024/11/25author:cmdragonexcerpt:webpack:error钩子是用于在Webpack编译过程中捕获和处理错误的一个重要机制。当发生编译错误时,这个钩子会被调用,通常用于在UI上给出反馈或者处理错误日志......
  • Phaser.js开发简单的2d小游戏demo
    初次发布于我的个人文档1.安装使用如下的命令之一就可以获取工程费的phaser项目。npmcreate@phaserjs/game@latestnpx@phaserjs/create-game@latestyarncreate@phaserjs/gamepnpmcreate@phaserjs/game@latestbuncreate@phaserjs/game@latest或者使用npminstal......