Ruby 斐波那契序列与时空复杂性解释?

Ruby 斐波那契序列与时空复杂性解释?,ruby,recursion,Ruby,Recursion,我是一名自学成才的程序员/新兵训练营毕业生,昨天在一次采访中,我刚被要求为斐波那契序列编写一个函数,我意识到当被问及以下两个序列之间的性能差异时,我有多少是不知道的: 使用for循环 使用递归 下面是我使用循环的答案: def fibonacci(n) first_value = 0 second_value = 1 final_value = nil if n == 0 final_value = first_value elsif n == 1 final

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

  • 使用for循环
  • 使用递归
  • 下面是我使用循环的答案:

    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
    时间和
    n
    空间。为什么?因为在每次呼叫中,它会自己呼叫两次,而每个孩子的呼叫需要几乎相同的时间来完成。内存方面:每个呼叫需要1个内存单元。调用后,释放所有使用的内存。所以,若你们画一个调用树,你们会看到这棵树的高度是
    n

    的线性函数,我建议你们读一下。它是C++的,但这对你的理解是必不可少的。谢谢我将阅读它,用循环计算斐波那契,你只需要迭代到
    N
    ,这意味着
    O(N)
    在时间上,基本上不需要空间。递归方法在时间和空间上都需要
    O(2^n)
    。要了解原因,请为类似于
    fibonacci(6)
    的东西绘制递归调用堆栈的层次结构图,并注意它是如何进行如此多的重复工作的。最好继续问这个问题。堆栈溢出是关于实际编程问题的。程序员是关于理论和编程的。