在學習 go 并發的過程中,意外看到了菊花鏈的代碼,一開始基本上對于整體流程摸不著頭腦,經過查閱資料和自己苦思,最終找到了兩個關鍵點,捋清了整個執行過程
代碼:
func TestFunc5(t *testing.T) {/* * 利用信道菊花鏈篩法求某一個整數范圍的素數 * 篩法求素數的基本思想是:把從1開始的、某一范圍內的正整數從小到大順序排列, * 1不是素數,首先把它篩掉。剩下的數中選擇最小的數是素數,然后去掉它的倍數。 * 依次類推,直到篩子為空時結束 */const max = 100 // 找出100以內的所有素數nums := xrange() // 初始化一個整數生成器number := <-nums // 從生成器中抓一個整數(2), 作為初始化整數for number <= max { // number作為篩子,當篩子超過max的時候結束篩選fmt.Println(number) // 打印素數, 篩子即一個素數nums = filter(nums, number) //篩掉number的倍數number = <-nums // 更新篩子}}func filter(in chan int, number int) chan int {// 輸入一個整數隊列,篩出是number倍數的, 不是number的倍數的放入輸出隊列// in: 輸入隊列out := make(chan int)go func() {for {i := <-in // 從輸入中取一個if i%number != 0 {out <- i // 放入輸出信道}}}()return out}func xrange() chan int { // 從2開始自增的整數生成器var ch chan int = make(chan int)go func() { // 開出一個goroutinefor i := 2; ; i++ {ch <- i // 直到信道索要數據,才把i添加進信道}}()return ch}
代碼是從網絡上復制,然后放在本地測試文件中進行調試的,自己運行的話可以把 TestFunc 改成 main
對于菊花鏈的代碼,從邏輯上來說并不復雜:
- 采用的是埃式篩,將 2-n 的整數按照從小到大的順序排列,以 2 為開始的素數,3/2 不能整除是素數,5/2 且 5/3 不能整除是素數,以此類推,不斷從小到大除以已經得出的素數,都不能整除,意味著它沒有可因式分解的余地,也就是素數;代碼也有改進的空間,即使用歐式篩,去除不必要的篩選(這個我還沒研究,感興趣的可以自己看看);
對于菊花鏈,對我個人而言,最關鍵的兩個點在于:
下面即是我捋出來的整個執行過程:
nums = filter(nums, number)
將 xrange channel 和 2 傳遞給 filter;nums = out
,然后 number = <- nums
更新 number 為 3;兩個關鍵點卡住了我很長時間,第一點很基礎但一時忽略了,而第二點尤為重要,讓我對整個執行過程總是隔著一層霧。還是需要更多的學習與實踐,記錄下分析結果,與君共勉。
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
如何刪除pe啟動項?具體的步驟追加1再點開始菜單,中,選擇運行,也可以用“winiconunlockR”快捷鍵就直接進入運行窗口,在窗口中鍵入“msconfig”命令,回車不能執行。2在彈出的“系統配置”窗口中,直接切換到“阻止”選項卡,選擇要刪除掉的啟動項,點擊下面的徹底刪除命令。如何刪除開始菜單中的設定程序訪問和默認值?你想問什么需要補充一下,我可以回答你!我明白了了。是這樣的找。你到控制面板...
安家電視劇演員表?羅進,孫立。王自健、田雷、孫嘉麗、楊浩宇、張、克里斯蒂娜、郭濤、席美娟、韓童生、李宗翰、丁嘉麗、白志迪、胡可、郝平、王以哲、梁超、戴樂樂。圖靈、楊坤、丁勇岱、董可飛、王志強、康群志、陳牧陽、遲鵬、王景碩、吳玉芳、閻學晶、劉濤、孫燕、錢杰、孫亮、張雯、劉杰、趙震、魏青、郭家明、馬亮等。安家電視劇演員表?《安家》是一部由安建執導的都市劇,由孫儷、羅晉、孫嘉瑜、張、和王以哲主演。該劇講...
石家莊新百廣場是什么區?是橋西區。石家莊新百廣場在橋西區。地址:河北省石家莊市中山西路139號(近中華街)。穿過新百廣場(東)(西三室內繪畫館)的線路:1號、1號、6號、11號、30號、34號、61號、68號、108號、118號、317號、326號、368號..途經新百廣場(西)的線路:1路、快車1路、游客1路、游客5路、6路、11路、30路、34路、61路、93路、快車107路、192路、317...