【问题标题】:Fibonacci Sequence and Time/Space Complexity explanation?斐波那契数列和时间/空间复杂性解释?
【发布时间】:2014-08-29 14:01:43
【问题描述】:

我是一名自学成才的程序员/新手训练营毕业生,昨天在一次采访中,我刚刚被要求为斐波那契数列编写一个函数,当被问及以下性能差异时,我意识到我不知道有多少:

  1. 使用 for 循环。
  2. 使用递归。

这是我使用循环的答案:

def fibonacci(n)
  first_value = 0
  second_value = 1
  final_value = nil
  if n == 0
    final_value = first_value
  elsif n == 1
    final_value = second_value
  else
    (n - 1).times do
      final_value = first_value + second_value
      first_value = second_value
      second_value = final_value
    end
  end
  final_value
end

这是我当时对递归的回答:

def fibonacci(n)
  if n == 0
    0
  elsif n ==1
    1
  else
    fibonacci(n-1) + fibonacci(n-2)
  end
end

所以他提到了如何使用2^n_____(填空)进行递归,而只有n_____ 用于循环。然后他问了时间/空间的复杂性,我有点迷茫。

我还没有拿起一本关于时间/空间复杂性的书。我会在算法书中学习这些东西吗?最近买了《算法设计手册》,还没打开。

当他说2^n某事时,他说的是时间还是空间?有人可以使用这两个函数解释时间/空间复杂性理论和差异吗?

【问题讨论】:

  • 我建议你读一读。它在 C++ 中,但这对您的理解至关重要。 READ
  • 谢谢!我会读的
  • 要使用循环计算斐波那契,您只需要迭代到N,这意味着O(N) 在时间上并且基本上不需要空间。递归方法在时间和空间上都需要O(2^n)。要了解原因,请为 fibonacci(6) 之类的东西绘制递归调用堆栈的层次图,并注意它是如何进行如此多的重复工作的。
  • 最好在Software Engineering 上询问。 Stack Overflow 是关于实际编程问题的。程序员是关于理论和编程的。

标签: ruby recursion


【解决方案1】:

这将花费2^n 时间和n 空间。为什么?因为每次调用它都会调用自己两次,并且每个子调用都需要几乎相同的时间来完成。作为内存:每个调用需要 1 个内存单元。调用后释放所有使用的内存。所以如果你画一个调用树然后你会看到这棵树的高度是n的线性函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 2017-07-25
    相关资源
    最近更新 更多