美文网首页
裴波那契数列基础版与优化版

裴波那契数列基础版与优化版

作者: 孟大仙 | 来源:发表于2021-04-19 16:34 被阅读0次
1. 裴波那契数列基础版概念

裴波那契数列是 最前的两位数是1, 之后的每个数都是前两个数之和。
数字实例: 1, 1, 2, 3, 5, 8, 13, 21..., 即 n = n-1 + n- 2.

2. 裴波那契数列的实现
function pp (n) {

  // 第1位、第2位都是1
  if (n === 1 || n === 2) {
    return 1
  } else {
    return pp(n-1) + pp(n-2)
  }
}
console.log(pp(10)) // 55
3. 性能检测

利用计数器,我们检测下函数被递归调用了多少次

let i = 0
function pp (n) {
  i ++
  // 第1位、第2位都是1
  if (n === 1 || n === 2) {
    return 1
  } else {
    return pp(n-1) + pp(n-2)
  }
}
let n = 30
console.log(`第${n}位的值是:`, pp(n)) // 第30位的值是: 832040
console.log('函数调用次数是', i) // 函数调用次数是 1664079

通过以上代码测试,在获得越大位数时, 函数递归的调用测试如此的多。所以我们需要对它进行进一步的优化,避免这么大计算开销。

4. 优化原理与实现

通过查看规律我们发现,递归函数的调用数字有很多重复情况,我们用个对象来存储其值。 把次位当做key, 位数的值作为value.

let i = 0
let o = {}
function pp (n) {
  i ++
  if (o[n]) {
    return o[n]
  }
  // 第1位、第2位都是1
  if (n === 1 || n === 2) {
    return o[n] = 1
  } else {
    o[n] = pp(n-1) + pp(n-2)
    return o[n]
  }
}
let n = 30
console.log(`第${n}位的值是:`, pp(n)) // 第30位的值是: 832040
console.log('函数调用次数是', i) // 函数调用次数是 57

通过以上测试发现,性能提升了很多由原来的1664079次变为了57次

相关文章

网友评论

      本文标题:裴波那契数列基础版与优化版

      本文链接:https://www.haomeiwen.com/subject/xbbilltx.html