【发布时间】:2014-08-29 14:01:43
【问题描述】:
我是一名自学成才的程序员/新手训练营毕业生,昨天在一次采访中,我刚刚被要求为斐波那契数列编写一个函数,当被问及以下性能差异时,我意识到我不知道有多少:
- 使用 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某事时,他说的是时间还是空间?有人可以使用这两个函数解释时间/空间复杂性理论和差异吗?
【问题讨论】:
-
我建议你读一读。它在 C++ 中,但这对您的理解至关重要。 READ
-
谢谢!我会读的
-
要使用循环计算斐波那契,您只需要迭代到
N,这意味着O(N)在时间上并且基本上不需要空间。递归方法在时间和空间上都需要O(2^n)。要了解原因,请为fibonacci(6)之类的东西绘制递归调用堆栈的层次图,并注意它是如何进行如此多的重复工作的。 -
最好在Software Engineering 上询问。 Stack Overflow 是关于实际编程问题的。程序员是关于理论和编程的。