关于Rob Pike求素数代码的一点理解

qjm134 · 2017-11-08 10:05:45 · 3391 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2017-11-08 10:05:45 的主题,其中的信息可能已经有所发展或是发生改变。

func generate(ch chan<- int) {

    for i:=2; ; i++ {

    ch <- i

    }

}

func filter(src <-chan int, dst chan<- int, prime int) {

    for i := range src {

    if i % prime != 0 {

        dst <- i

    }

    }

}

func sieve() {

    ch := make(chan int)

    go generate(ch)

    for {

    prime := <-ch

    fmt.Println(prime, "\n")

    ch1 := make(chan int)

    go filter(ch, ch1, prime)

    ch = ch1

    }

}

求素数使用使用埃拉托斯特尼尔算法:先用一个最小的素数2去筛除2的倍数,接下来下一个被筛除的数是素数(这里指的是 3),再用这个素数3去筛除掉3的倍数,得到下一个素数,这样不断的重复下去,直到筛完为止。

个人理解:

  1. Range 不止读,且取,类似<-chan,阻塞
  2. Sieve() 里的for每循环一次,生成一个ch1,将底层地址传给新的goroutine filter()的dst,上一个goroutine 的prime筛过生成的dst作为本goroutine 的src,再用本goroutine的prime再筛一遍,放入本goroutine的 dst,这样层层筛选
  3. 每个filter() 有自己的函数域内变量src, dst, prime
    src1    dst1(src2)    dst2(src3)    dst3

  p1  2

    3  p2    3
    4
    5        5      p3    5
    6
    7        7            7            7

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3391 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传