【发布时间】:2011-09-20 00:42:05
【问题描述】:
这是作业,但课程已经给了我答案。我无法将答案中的单词放到代码行中
#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
这是“埃拉斯托提尼筛”的一个版本。
这是给我的解释。
这个例子中的新东西……
内置函数 range 实际上返回一个可以像所有其他列表一样使用的列表。 (它包括第一个索引,但不包括最后一个。)列表可以用作逻辑变量。如果它不是空的,那么它是真的——如果它是空的,那么它就是假的。因此,虽然候选人的意思是“当命名候选人的列表不为空时”或只是“当仍有候选人时”。您可以在 someList 中编写 if 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 的变量。对于算法的每次迭代(“轮次”),我们删除所有是这个基数的倍数的所有数字(它总是候选者中的最小者)。在每次迭代之后,我们知道剩下的最小数字是质数(因为所有作为较小数字乘积的数字都被删除了——明白吗?)。因此,我们将它添加到结果中,将新基数设置为这个数字,并将其从候选列表中删除(因此我们不会再次处理它。)当候选列表为空时,结果列表将包含所有素数.聪明吧?
我不明白他们在哪里说,“我们删除所有是这个基数的倍数的数字。”那在代码行的哪里?有人可以逐行解释程序在做什么吗?我是这方面的新手,试图了解每一行代码的机制以及原因。感谢您的帮助。
【问题讨论】: