查找斐波纳契数列中第 N 个数

题目

查找斐波纳契数列中第 N 个数

很多朋友看到“纳契”是不是很开心,这个 纳契 可不是“纳妾”,呵呵呵

所谓的斐波纳契数列是指

前 2 个数是 0 和 1 。

第 i 个数是第 i-1 个数和第 i-2 个数的和。

斐波纳契数列的前 10 个数字是

0, 1, 1, 2, 3, 5, 8, 13, 21, 34 ...

示例

给定 1,返回 0

给定 2,返回 1

给定 10,返回 34

分析

简单的想法就是递归,规则很明显了,但是有没有更好的解法呢?

Just Try

请你自动动手试一下:在线编程环境

想想有没有其他思路?

想想时间和空间复杂度,能否优化一下

真的做不到么?

let you think, think makes you happy!

参考答案

思路:递归

代码很简单,看下就会了

function fibonaqi(n){
  if(n==1) return 0;
  if(n==2) return 1;
  return fibonaqi(n-1)+fibonaqi(n-2)
}
function main(param) {
  console.show(fibonaqi(param))
}
main(10)

PS:思考一下性能问题,试试把入参改成100? 是不是会卡死一段时间? 经我测试入参在45的时候还可以勉强算出来。

思路:动态规划

看到一篇博客介绍动态规划,优化上面递归的方法,new 了一个长度为 n+1 的数组,用于存放 f(0) 到 f(n) 这 n+1 个状态的计算结果。实测效果提升显著。

动态规划就是:将原问题拆解成若干子问题,同时保存子问题的答案,使得每个子问题只求解一次,最终获得原问题的答案。

let temp = []
function fibonaqi(n){
  if(n==1) return 0;
  if(n==2) return 1;
  if(!temp[n]){
    temp[n] = fibonaqi(n-1)+fibonaqi(n-2)
  }
  return temp[n]
}
function main(...param) {
  console.show("参数:" + param, "结果:" + JSON.stringify(fibonaqi(param)))
  testPerformance(fibonaqi, param)
}
main(40);

思路:正向计算

比如让我计算第10个,我就挨个计算前10个,然后返回,因为正好和斐波那契数列的规则相似,所以一层循环就可以计算完。

function fibonaqi(n){
  let arr=[0,1]
  for(let i=2;i<n;i++){
    arr[i] = arr[i-1] + arr[i-2]
  }
  return arr[n-1]
}
function main(param) {
  console.show(fibonaqi(param))
}
main(10)

代码复制到在线编程环境试一下:在线编程环境



请遵守《互联网环境法规》文明发言,欢迎讨论问题
扫码反馈

扫一扫,反馈当前页面

咨询反馈
扫码关注
返回顶部