zoukankan      html  css  js  c++  java
  • 用生成器实现素数序列

    先说说思路:

    素数是一个无限循环,这一点跟生成器的特性很像,所以我们用生成器所谓这个素数序列的主要部分。

    第二步就是要筛选了,首先从自然数序列中,从2开始的自然数序列,用一个生成器表示比较合适。

    从以第个元素开始2,肯定是素数,收入到素数集合里,取下一个元素,由于前一个元素的所有倍数都被筛选掉了,所以新序列的第一个元素一定是素数“除了自己之外,没有约数”

    循环不止,筛选不止。得到是这个无限循环列表就是素数序列

    筛选的过程我们想起来内建函数filter(),特性很像mapreduce,可以用来所列表筛选。

    于是第一步,我们先用生成器组建从2开始的自然数序列,代码如下:

    1 def OddList():
    2     n = 1
    3     while True:
    4         n += 1
    5         yield 

    第二步:我们要设置筛选函数,对于一个新的序列,我们要拿到第一个元素,然后对整个序列做一次迭代,删掉第一个元素的倍数,该特性与filter()一样,

    1 def MultiFilter(multipleNum):
    2     return lambda element: element % multipleNum > 0 
    说明:由于multifilter是被filter()包含的,所以multerfilter中有一个参数是序列的元素,一定会传进来的,但是由于无法表示2个参数,所以考虑用匿名




    第三步:
    限迭代奇数生成器,在每一个迭代中,生成一个新的序列(生成器),生成新序列的过程又是一个迭代过程,在这个过程中把元素n的倍数过滤掉
    
    
    1 def PrimeList(maxNum):
    2     mainList = OddList()              #主要为了生成2
    3     firstElement = next(OddList())    #curentElement 标签始终指向当前元素,作为倍数参与筛选
    4     yield firstElement
    5     while firstElement < maxNum:
    6         mainList = filter(MultiFilter(firstElement), mainList)     ##mainList 标签始终指向主生成器,用生成器OddList()初始化
    7         firstElement = next(mainList)             #每次只取新序列的一个元素
    8         yield firstElement

    其实我们发现,是不断筛选mainList这个生成器,新序列的第一个元素一定是素数,我们做二次生成,再以生成器的形式存储。剩下的就是迭代新的素数生成器了

    1 if __name__ == '__main__':
    2     for x in PrimeList(1000):
    3         print(x)


  • 相关阅读:
    jquery,日常 记录知识 点 (选择器的引用类型)
    jQuery之map()和get() map().get().join意思
    转 谈谈JS里的{ }大括号和[ ]中括号的用法,理解后就可以看懂JSON结构了。
    CSS属性
    CSS3属性
    写网页的随意 记录要点
    css,查询相应标签,div等
    CSS ,浮动,clear记录,和一些转载别处
    linux下如何关闭防火墙?如何查看防火墙当前的状态
    Objective-C和Swift混合编程开发
  • 原文地址:https://www.cnblogs.com/fanyuchen/p/7213686.html
Copyright © 2011-2022 走看看