范围内的纸牌负数是多少?

时间:2017-08-25 21:00:03

标签: python loops range fibonacci

我正在从John Zelle关于Python的书中做一个练习,他要求使用循环函数来完成Fibonacci序列。

在我没有完成任务之后,我看了一下他的决议,这就是:

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循环没有对Fibonacci序列的前两个值求和,因为它们都是1,并且只有在用户提示2之后,循环才真正开始添加起来。我猜对了吗?

2 个答案:

答案 0 :(得分:1)

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

因此,如果n为1或2,则不输入for循环,结果是curr(设置为1)。

答案 1 :(得分:1)

如果为此输入0或1,则代码不会进入循环,结果是 curr 的初始值,即 1 。对于任何更高的值,循环将迭代地计算适当的值。

您对负值的记忆有点偏离:负索引将从 iterable 的另一端(例如list,tuple,string)起作用。 范围不是那个类;在这种情况下的结果是一个空的范围。

OP评论后

澄清

我看到你的困惑。 范围返回给定值的可迭代值。但是,看起来你已经将索引的限制混淆了。让我们使用一般形式:

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

左*默认为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),然后,对该列表的引用 index 将从右侧开始计数列表的末尾。请注意第三个示例,使列表“向后”,0向下到-8。在这种情况下,负面索引也适用于右侧。负的右端值,负的步骤和负的索引是三种不同的用法。

这样可以解决问题吗?