python用遞迴篩選法求N以內的孿生質數(孿生素數)--附氣泡排序和插入排序練習
阿新 • • 發佈:2018-11-20
本人最近讀完一本書《質數的孤獨》,裡面講到孿生質數,就想查一下孿生質數的分佈情況。其中主要用到了計算質數(素數)的方法,搜了一下,排名前幾的都是用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