Fibonacci序列和时间/空间复杂性解释?

时间:2014-08-29 14:01:43

标签: ruby recursion

我是自学成才的程序员/训练营毕业生,我刚刚在面试时被要求为斐波纳契序列编写一个函数,并意识到当被问及性能时我还不知道多少差异:

  1. 使用for循环。
  2. 使用递归。
  3. 这是我使用循环的答案:

    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 _____ 。然后他询问时间/空间的复杂性,我有点失落。

    我还没有拿起一本关于时间/空间复杂性的书。我会在算法书中学到这些东西吗?我最近买了#34;算法设计手册"但尚未打开它。

    当他说2^n某事时,他是在谈论时间或空间吗?有人能用这两个函数解释时间/空间复杂性理论和差异吗?

1 个答案:

答案 0 :(得分:0)

这需要2^n时间和n空间。为什么?因为在每次呼叫时它会自己调用两次,每个子呼叫需要几乎相同的时间才能完成。至于内存:每次调用需要1个内存单元。呼叫后,释放所有已用内存。因此,如果您绘制一个调用树,那么您将看到此树的高度是n的线性函数。