Golang利用select和普通函数分别实现斐波那契数列

//斐波那契数列
//1 1 2 3 5 8
//观察规律
//第一轮:前两个数是1,1,相加等于2
//第二轮:第二个数和第三个数是1,2,相加等于3
//第三轮:第三个数和第四个数是2,3,相加等于5
//第四轮:第四个数和第五个数是3,5,相加等于8
//也就是说两个数相加的和,和前面的数相加

package main

import (
    "fmt"
)

//ch只写,quit只读
func fibonacci(ch chan<- int, quit <-chan bool) {
    x, y := 1, 1
    for {
        //监听channel数据的流动
        select {
        case ch <- x: //往里写 。第一次写的时候是1,如果没有地方读的话,那么这里会阻塞
            x, y = y, x+y //第一次是往ch写1,y的值也是1,下一次y的值就是x+y
        case flag := <-quit:  //
            fmt.Println("flag = ", flag)
            return
        }
    }
}

func main() {
    ch := make(chan int)    //数字通道
    quit := make(chan bool) //程序是否结束

    //消费者,从channel读取内容
    //新建协程
    go func() {
        for i := 0; i < 8; i++ {
            num := <-ch      //这里读是因为防止select那里会阻塞
            fmt.Println(num)
        }
        //可以停止
        quit <- true
    }() //别忘了()

    //生产者,产生数字,写入channel
    fibonacci(ch, quit)

}
1
1
2
3
5
8
13
21
flag =  true

上面是使用select,下面用普通函数实现

package main

import (
    "fmt"
)

func Fibonacci() func() int {
    a, b := 0, 1
    return func() int {
        a, b = b, a+b
        return a
    }
}

func main() {

    f := Fibonacci()
    fmt.Println(f())
    fmt.Println(f())
    fmt.Println(f())
    fmt.Println(f())
    fmt.Println(f())
    fmt.Println(f())
    fmt.Println(f())
    fmt.Println(f())
    fmt.Println(f())
    fmt.Println(f())
}
1
1
2
3
5
8
13
21
34
55
原文地址:https://www.cnblogs.com/wt645631686/p/9690251.html