我是自学成才的程序员/训练营毕业生,我刚刚在面试时被要求为斐波纳契序列编写一个函数,并意识到当被问及性能时我还不知道多少差异:
这是我使用循环的答案:
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
某事时,他是在谈论时间或空间吗?有人能用这两个函数解释时间/空间复杂性理论和差异吗?
答案 0 :(得分:0)
这需要2^n
时间和n
空间。为什么?因为在每次呼叫时它会自己调用两次,每个子呼叫需要几乎相同的时间才能完成。至于内存:每次调用需要1个内存单元。呼叫后,释放所有已用内存。因此,如果您绘制一个调用树,那么您将看到此树的高度是n
的线性函数。