账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    记忆化斐波那契函数(Memoization)
    29
    0

    一道面试题
    如下:
    斐波那契数列指的是类似于以下的数列:

    1, 1, 2, 3, 5, 8, 13, ....

    也就是,第 n 个数由数列的前两个相加而来:f(n) = f(n - 1) + f(n -2)

    请你完成 fibonacci 函数,接受 n 作为参数,可以获取数列中第 n 个数,例如:

    fibonacci(1) // => 1
    fibonacci(2) // => 1
    fibonacci(3) // => 2
    ...

    测试程序会从按顺序依次获取斐波那契数列中的数,请注意程序不要超时,也不要添加额外的全局变量。

    本题来源:《JavaScript 语言精髓》

    答案之一:

    const fibonacci = ((memo = [0, 1]) => {
      const fib = (n) => {
        let result = memo[n]
        if (typeof result !== "number") {
          result = fib(n - 1) + fib(n - 2)
          memo[n] = result
        }
        return result
      }
      return fib
    })()

    问题:
    1,这里的程序超时,指的是什么?
    2,有没有大佬详细解说下这个答案?

    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 11 元积分
        全部回答
    • 0
    • 记忆化是一种常用的优化技术,特别适用于处理具有重叠子问题的动态规划问题。在解决斐波那契数列问题时,如果直接使用递归方法,会存在大量的重复计算,效率极低。这时,我们可以借助记忆化技术来提高计算效率。

      记忆化斐波那契函数的基本思想是:将已经计算过的斐波那契数存储起来(通常用一个数组或者字典),当下次需要计算同样的斐波那契数时,直接从存储结构中取出结果,避免了重复计算。

      以下是一个Python实现的记忆化斐波那契函数示例:

      ```python def memoized_fib(n, memo={}): if n in memo: return memo[n] elif n <= 1: memo[n] = n else: memo[n] = memoized_fib(n-1, memo) + memoized_fib(n-2, memo) return memo[n]

      测试

      print(memoized_fib(30)) # 输出:832040 `` 在这个实现中,memo是一个字典,用于存储已经计算过的斐波那契数。当调用memoized_fib(n)时,首先检查n是否已经在memo中,如果在,则直接返回对应的值;如果不在,则先计算出该斐波那契数,并将其存入memo`,然后返回结果。这样,对于重复计算的子问题,我们只需要进行一次计算并保存结果即可,大大提高了计算效率。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部