【问题标题】:Data Structures - lists数据结构 - 列表
【发布时间】: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 的变量。对于算法的每次迭代(“轮次”),我们删除所有是这个基数的倍数的所有数字(它总是候选者中的最小者)。在每次迭代之后,我们知道剩下的最小数字是质数(因为所有作为较小数字乘积的数字都被删除了——明白吗?)。因此,我们将它添加到结果中,将新基数设置为这个数字,并将其从候选列表中删除(因此我们不会再次处理它。)当候选列表为空时,结果列表将包含所有素数.聪明吧?

我不明白他们在哪里说,“我们删除所有是这个基数的倍数的数字。”那在代码行的哪里?有人可以逐行解释程序在做什么吗?我是这方面的新手,试图了解每一行代码的机制以及原因。感谢您的帮助。

【问题讨论】:

    标签: python data-structures


    【解决方案1】:

    在每个while candidates: 循环的开头,product 等于base。然后在那个循环中你有另一个循环,while products &lt; 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
        ...
    

    【讨论】:

    • 所以'将基础设置为新值',新值是什么以及它从哪里获得该值?
    • @G.G base 将被设置为你知道是素数的“左边最小的数”(正如你在问题中所说的)。
    • 还有一件事......所以当我们开始循环 while product
    • @G.G 你可以看到在while product &lt; 1000 循环之后,我们将base 附加到result 列表中。所以2 将被添加到素数列表中。
    • @G.G 正如我之前所说,该行将基数设置为“左边的最小数字”或“candidates 左边的最小数字”或candidates[0]
    猜你喜欢
    • 2018-04-14
    • 2019-05-25
    • 1970-01-01
    • 2012-09-12
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    相关资源
    最近更新 更多