1. 程式人生 > >python用遞迴篩選法求N以內的孿生質數(孿生素數)--附氣泡排序和插入排序練習

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