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
复制代码

 

posted @   温柔的风  阅读(736)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2017-09-22 Mysql索引结构与索引原理及hash索引介绍
2017-09-22 Nginx和Apache有什么区别?
点击右上角即可分享
微信分享提示