2012-12-02 36 views
0
fibs = {0: 0, 1: 1} 
def fib(n): 
    if n in fibs: return fibs[n] 
    if n % 2 == 0: 
     fibs[n] = ((2 * fib((n/2) - 1)) + fib(n/2)) * fib(n/2) 
     return fibs[n] 
    else: 
     fibs[n] = (fib((n - 1)/2) ** 2) + (fib((n+1)/2) ** 2) 
     return fibs[n] 


def test(n): 
    count = range(0,n) 
    seq = [] 
    for i in count: 
     seq.append(fib(i)) 
    return seq 

print test(10) 

[0, 1, 1, 2, 3, 5, 8, 13, 21, 34] 

如何使它從1開始,而不是0,這樣的結果是更改開始迭代的值在一序列的Python

[1, 2, 3, 5, 8, 13, 21, 34, 55, 89] 

我試圖改變的FIB到{1:1,2:2 }但它不起作用

+2

您可以用'count = range(2,n + 2)'替換'count = range(0,n)'來獲得預期的輸出。 – Nicolas

回答

1

您可以用count = range(2,n + 2)替換count = range(0,n)以獲得預期輸出。 -

通過

薩科

def test(n): 
    count = range(2,n+2) 
    seq = [] 
    for i in count: 
     seq.append(fib(i)) 
    return seq 

謝謝!

0

你可以做這兩件事情。假設你的結果存儲在fibonacciNumbers中。 一種選擇是片名單:

fibonacciNumbers[2:] 

第二個選擇是簡單地從fibonacciNumbers彈出的第一個元素。

for i in range(2): 
    fibonacciNumbers.pop(0) 
+0

只有稍微更高效;彈出列表中的第一項需要將​​所有其他項目向下移動到內存中,實質上是複製所有項目。 – kindall

+0

你說得對。相反,collection.deque對於添加/刪除操作更有意義。我的意思是在末尾添加/刪除O(1)。我有一個誤解,python的列表是一個鏈表實現。無論如何,我沒有註明我的答案。感謝您的澄清。 –