python用递归筛选法求N以内的孪生质数(孪生素数)--附冒泡排序和插入排序练习

本人最近读完一本书《质数的孤独》,里面讲到孪生质数,就想查一下孪生质数的分布情况。其中主要用到了计算质数(素数)的方法,搜了一下,排名前几的都是用for循环来做的,感觉略微麻烦了一些,在比较一些还是觉得用递归筛选法来解决这个问题。

新建List,然后从第0位开始,如果后面的能被这个数整除,则从数组中移除改元素,以此类推,最后留下的就是质数(素数)。

python版本与java版本不同,java可以在遍历list的时候删除该元素,可以对循环变量i进行i--的操作,防止以后的get(i)方法报错,python不支持这个操作只能是拿到被删除的元素,然后在遍历结束以后再去删除

代码如下:

#!/usr/bin/python3

class Test():
    def __init__(self):
        print ("fan")
    def get(self,list,st):
        n = list[st]
        a = []
        for i in range(st+1,len(list)):
            if list[i] % n == 0:
                a.append(list[i])
        for x in a:
            list.remove(x)
        if len(list) > st+1:
            self.get(list,st+1)
if __name__ == "__main__":
    test = Test()
    list = [i for i in range(2,5000)]
    test.get(list,0)
    for i in range(len(list)-1):
        a = list[i]
        b = list[i+1]
        if b-a==2:
            print ("孪生质数:"+str(a)+"----"+str(b))

这里备注一下:python为了防止内存溢出,限制了递归的深度,所以直接求10000以内的还不行,会报错:

RecursionError: maximum recursion depth exceeded in comparison

最后附上一份冒泡排序和插入排序的练习代码:

    def fan(self,list):
        for i in range(len(list)):
            for j in range(i,0,-1):
                a = list[j]
                b = list[j-1]
                if b > a :
                    c = a
                    list[j]=b
                    list[j-1]=c
    def fan2(self,list):
        for i in range(len(list)):
            for j in range(len(list) - i - 1):
                a = list[j]
                b = list[j+1]
                if a > b :
                    c = a
                    list[j] = b
                    list[j + 1] = c

欢迎有兴趣的一起交流:群号:340964272

猜你喜欢

转载自blog.csdn.net/Fhaohaizi/article/details/82856204
今日推荐