2017-08-10 44 views
-8
def fib(n): 
    if n==0 or n==1: 
     return n 
    else: 
     return fib(n-1)+fib(n-2) 

n = int(input()) 
for val in range(n): 
    print(fib(val)) 

#I做了一些計算,得到O(n^2),但我不知道正確的答案什麼是這個程序的大O複雜性...我得到O(2^n),但我無法找到正確的答案

+3

你認爲這是什麼?向我們展示您的分析。 –

+7

這似乎很明顯是你應該完成的編程課程的一項任務或練習,而且你沒有表現出至少你試圖弄清楚它。 – lmiguelvargasf

+4

這不是讓人們爲你做作業的網站。 – nmichaels

回答

0

不同的參數:

你的算法遞歸,直到它「觸底」,在fib(1)返回1.

所以,你這樣做(斐波那契數)調用得到斐波那契並添加1。

所以fib(n)O(fib(n))

比奈的斐波那契數公式可以寫成fib(n) == int(0.5 + (phi ** n)/(5 ** 0.5))其中phi是黃金比例,1.6180339 ......

剝離常數,你會得到O(phi ** n)這就減少了O(2 ** n)

現在,fib(n)實際上比O(fib(n))多一點點,因爲你也會對fib(0)進行一堆調用,它返回0--因此它增加了調用次數而不是總和。

事實證明,計算fib(n)時,你讓fib(n - 1)調用fib(0)挑戰:編寫一個函數來證明這一點!)。

所以fib(n)實際上是O(fib(n) + fib(n - 1))O(fib(n + 1))這是O(phi ** (n + 1)),仍然減少了O(2 ** n)

+0

如果你認爲你的答案與副本中的答案有所不同,寫在那裏。 –

+0

我也一樣,但我無法說服周圍的人 –

相關問題