首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用缓存的Fibonacci

使用缓存的Fibonacci
EN

Code Review用户
提问于 2013-09-30 14:54:39
回答 2查看 739关注 0票数 3

这是我在CoffeeScript中的简单Fibonacci实现。你认为如何?使用缓存(fibResults)非常快。

代码语言:javascript
复制
fibResults = []
defaultMax = 1000
nrMax = defaultMax

fibonacci = (n) ->
  return fibResults[n] if fibResults[n]

  if n < 2
    fibResults[n] = n
  else
    fibResults[n] = fibonacci(n - 1) + fibonacci(n - 2)

nrMax = process.argv[2] if process.argv[2]

console.log("#{i}: #{fibonacci(i)}") for i in [0..nrMax]
EN

回答 2

Code Review用户

发布于 2013-09-30 16:51:07

我在您的算法中注意到的是,尽管使用了回忆法,但每次计算它时,仍然会将Fibonnacci数重新分配到数组中。

通过像computeIfAbsent这样的函数确定给定n的Fibonacci是否已经计算过,如果没有,可以使用Fibonacci函数来计算它并将其放入数组中,但这一次才是如此。

另外,我们可以避免计算前两个斐波纳契,从一开始就对它们进行回忆录,并使任何索引n小于0的代码失败。

代码语言:javascript
复制
memo = [0,1]

computeIfAbsent = (n, f) ->
    fib = memo[n]
    if typeof fib is 'undefined'
        fib = f(n)
        memo[n] = fib
    fib

fibonacci = (x) ->
    if x < 0 
        throw Error("Invalid index: " + x)
    computeIfAbsent(x, (n) -> fibonacci(n-1) +  fibonacci(n-2))

console.log("#{i}: #{fibonacci(i)}") for i in [0..79]

不过,您必须知道,此代码不会检测到算术溢出。它可能看起来是正确的计算,但实际上,计算可能是错误的,因为溢出。我认为你的版本和我的版本开始在79左右产生无效的结果。

可以使用Fibonacci计算器进行检查。

票数 1
EN

Code Review用户

发布于 2013-10-02 16:22:12

或者你可以做黄金配给黑客^_~ (在Javascript中)

代码语言:javascript
复制
var M = Math
  , pow = M.pow
  , round = M.round
  , phi = (M.sqrt(5)+1)/2
  , phiAnd2 = phi +2
  ;
function fib(n){
  return round(pow(phi,n)/phiAnd2)
}

虽然当fib(75) n=75 2111485077978050时,这个值仅能达到===

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/32032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档