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
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)
的东西绘制递归调用堆栈的层次结构图,并注意它是如何进行如此多的重复工作的。最好继续问这个问题。堆栈溢出是关于实际编程问题的。程序员是关于理论和编程的。