这是作业,但课程给了我答案。我无法将答案中的单词放到代码行中
#Calculate all the primes below 1000
result = [1]
candidates = range(3, 1000)
base = 2
product = base
while candidates:
while product < 1000:
if product in candidates:
candidates.remove(product)
product = product + base
result.append(base)
base = candidates[0]
product = base
del candidates[0]
result.append(base)
print result
这是“Erastothenes的筛子”的一个版本。
这是给我的解释。
此示例中的新内容......
内置函数范围实际上返回一个可以像所有其他列表一样使用的列表。 (它包括第一个索引,但不包括最后一个索引。)列表可以用作逻辑变量。如果它不是空的,那么它是真的 - 如果它是空的,那么它是假的。因此,虽然候选人的意思是“虽然候选名单不是空的”,或者只是“当仍有候选人时”。您可以编写someList中的someElement以检查元素是否在列表中。您可以编写someList.remove(someElement)以从someList中删除someElement。您可以使用someList.append(something)将元素追加到列表中。实际上,您也可以使用+(在someList = someList + [something]中),但效率不高。您可以通过在列表名称后面的括号中将其位置作为数字(其中第一个元素,奇怪地,是元素0)给出一个列表的元素。因此someList [3]是列表someList的第四个元素。 (有关此内容的更多信息。)您可以使用关键字del删除变量。它也可以用于(如此处)从列表中删除元素。因此del someList [0]删除someList的第一个元素。如果删除前列表为[1,2,3],则之后为[2,3]。
在继续解释索引列表元素的奥秘之前,我将简要解释一下这个例子。
这是古代算法的一个版本,叫做“Erastothenes的筛子”(或接近它的东西)。它考虑一组(或在这种情况下,列表)候选数字,然后系统地删除已知不是素数的数字。我们怎么知道?因为它们是另外两个数字的产物。
我们从包含数字[2..999]的候选人列表开始 - 我们知道1是素数(实际上,它可能会也可能不会,取决于你问的人),我们希望所有素数都低于1000 (实际上,我们的候选人名单是[3..999],但是2也是候选人,因为它是我们的第一个基地)。我们还有一个名为result的列表,它始终包含更新的结果。首先,此列表仅包含数字1.我们还有一个名为base的变量。对于算法的每次迭代(“循环”),我们删除所有这个基数的多个数字(它总是最小的候选者)。在每次迭代之后,我们知道剩下的最小数字是素数(因为所有较小数字的数字都被删除了 - 得到它?)。因此,我们将其添加到结果中,将新基数设置为此数字,并将其从候选列表中删除(因此我们不会再次处理它。)当候选列表为空时,结果列表将包含所有素数。聪明,是吗?
我不明白的是他们说的话,'我们删除了这个基数的某个倍数的所有数字。'代码行中的位置在哪里?有人可以逐行解释程序正在做什么吗?我是一个新手,试图理解每行代码的机制以及原因。感谢您的帮助。
答案 0 :(得分:1)
在每个while candidates:
循环开始时,product
等于base
。然后在该循环中,您有另一个循环while products < 1000
。在此循环结束时,您将product
增加base
。因此product
遍历base
的每个倍数。然后删除product
的所有值,即“删除基数的倍数”。
基本上程序正在做的是:
...
set product to base
for each candidate
for each multiple of base, referred to as 'product'
remove product from candidates
set base to new value
reset product to new base
...