2017-08-25 50 views
-1

我正在從John Zelle關於Python的書中做練習,他要求用循環函數做斐波那契數列。範圍上的紙牌負數是什麼?

後,我沒能完成它,我給看看他的決心,這是這樣的:

n = int(input("Enter the value of n: ")) 
curr, prev = 1, 1 
for i in range(n-2): 
    curr, prev = curr+prev, curr 
print("The nth Fibonacci number is", curr) 

雖然我也明白他做了什麼的一部分,我錯過了一部分(n-2)範圍。

我在這裏看了一下Stackoverflow來看看這個,人們說範圍上的負數會回到列表的末尾。但在這種情況下,如果用戶提示1,則結果將是range(-1)

我的猜測是,作者這樣做是爲了讓for循環沒有將斐波那契數列的前兩個值相加,因爲它們都是1,並且只有在用戶提示2和4之後,循環纔會真正開始加起來。我猜對了嗎?

+0

是的。 'range(-x)'或'range(0)'不會產生任何東西。 – kindall

+4

這是你可以輕鬆測試的東西,不是嗎? – trincot

+0

閱讀[文檔](https://docs.python.org/3/)。大多數Python內置函數都在[functions]下(https://docs.python.org/3/library/functions.html#func-range)。範圍和其他內置對象的詳細信息大部分都在[Built-In Types]中(https://docs.python.org/3/library/stdtypes.html#typesseq-range)。 –

回答

1

如果爲此輸入0或1,碼不進入循環,並且結果是CURR的初始值,即是。對於任何更高的值,循環將迭代計算適當的值。

您對負值的記憶有點偏離:負指數將從可迭代的(例如,列表,元組,字符串)的另一端起作用。 A 範圍並不完全屬於該類;在這種情況下的結果是空的範圍。


澄清 OP評論後

我看到你的困惑。 範圍返回給定值的迭代。但是,它看起來像你已經與索引混淆了限制。讓我們使用一般形式:

r = range(left, right, step) 
r[pos] 

left * defaults to 0; **步驟默認爲1

下面是一些例子:

>>> r = range(0, 20, 2) 
>>> r[-1] 
18 
>>> r = range(0, -1) 
>>> r 
[] 
>>> r = range(0, -10, -2) 
>>> r 
[0, -2, -4, -6, -8] 
>>> r[-2] 
-6 

注意第二和第三例子,在這裏我們使用負值爲端點。在負面端點和負面索引之間存在區別。端點用於構建列表;如果端點不是該步驟隱含的順序,那麼結果範圍就是空列表。 範圍(0,-1)就是這樣一個例子。

一旦列表構建,如與範圍(0,20,2),然後一個參照成該列表具有負索引將從列表的右端計數。請注意第三個例子,製作一個「落後」的列表,0到-8。這種情況下的負指數也適用於右側。消極的右端價值,負面的階段和負面的指數是三種截然不同的用法。

這是否清理的東西?

+0

感謝您的答案和澄清索引/範圍負值錯誤! – Kalienov

+0

就這樣,我直接理解了這一點,我正在關注內置類型的4.6.6節,它說:「範圍確實支持負指數,但這些被解釋爲從正序指數確定的序列末尾進行索引「。有一個例子:r =範圍(0,20,2),然後r [-1]等於18.所以在這個例子中,這是一個可迭代的? – Kalienov

1
>>> range(-1) 
range(0, -1) 

因此,如果n爲1或2並且curr(設置爲1)是結果,則不會輸入for循環。