【问题标题】:How many fibonacci(2) calls are made when computing fibonnaci(7)?计算 fibonnaci(7) 时调用了多少 fibonacci(2)?
【发布时间】:2014-02-27 22:46:04
【问题描述】:

当您运行 Fib(7) 时,有多少次调用 Fib(2)?

算法定义如下:

Algorithm Fib(n):

    if n = 0 or n = 1
        then f = n
        else f = Fib(n-1) + Fib(n - 2)
    endif
    return f

我认为答案是 7。

【问题讨论】:

  • 看看SICP video 1b @40m,看看大师在fib(4)画树。
  • @NolanHodge:我不确定我的评论有什么可报告的。答案总是另一个斐波那契数,这是您问题的一个有趣属性。
  • 为什么不自己数一数呢?

标签: algorithm recursion fibonacci


【解决方案1】:

这是您在 Python 中的伪代码实现(几乎是复制粘贴):

def Fib(n):
    if n == 0 or n == 1:
        f = n
    else:
        f = Fib(n-1) + Fib(n - 2)
    return f

print Fib(7)

现在,我添加以下几行:

if n == 2:
    print 'Fib(2)'

结果是:

Fib(2)
Fib(2)
Fib(2)
Fib(2)
Fib(2)
Fib(2)
Fib(2)
Fib(2)
13

这意味着 Fib(2) 被调用 8 次

【讨论】:

    【解决方案2】:

    设 f(n) 为计算 Fib(n) 时对 Fib(2) 的调用次数。

    那么,f(2) = 1,f(3) = 1,对于 k > 3,f(k) = f(k-1) + f(k-2)。

    这与 Fib 本身具有相同的递归关系,并且您得到解 f(k) = Fib(k-1)。对于特殊情况 k=7,您会得到解 Fib(6) = 8。

    这概括了:计算 Fib(n) 时对 Fib(m) 的调用次数为 Fib(n-m+1)(假设 n >= m)。

    【讨论】:

      【解决方案3】:

      为了好玩,在 Python 中:

      def fib(n):
          def fib2(n):
              count[n] = count.get(n,0)+1
              if n < 2:
                  return n
              else:
                  return fib2(n-1) + fib2(n-2)
          count = {}
          return fib2(n), [(c, count[c]) for c in sorted(count)]
      
      print(fib(7))
      

      打印

      => (13, [(0, 8), (1, 13), (2, 8), (3, 5), (4, 3), (5, 2), (6, 1), (7, 1)])
          ===                   ======
      

      所以 fib(7) 的结果是 13 并且 fib(2) 被调用 8 次。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-11
        • 1970-01-01
        • 2019-10-17
        • 2021-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多