2017-08-25 46 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循环。