首页 > 其他分享 >简单的斐波那契数列通过chan实现生产者消费者模型

简单的斐波那契数列通过chan实现生产者消费者模型

时间:2024-02-07 16:32:24浏览次数:35  
标签:wg 数列 int chan fibs 斐波 那契 消费者

1.实现斐波拉契数列

写一个函数返回长度为n的斐波拉契slice数组

func fi(n int) []int {
	if n <= 0 {
		return []int{}
	}
	fibs := make([]int, n)
	fibs[0] = 0
	if n > 1 {
		fibs[1] = 1
		for i := 2; i < n; i++ {
			fibs[i] = fibs[i-1] + fibs[i-2]
		}
	}
	return fibs
}

注意点,

1.make切片的时候长度为n,不要写0

2.初始化fibs[0]分fibs[1]的值

简单的斐波那契数列通过chan实现生产者消费者模型_Group

2.生产者消费者

1.写一个生产者,生产n个斐波那契数列,比如从长度8开始生成10次,也就是生成长度为8, 9, 10,到17的这个n个数列

2.写一个消费者消费生产的n个斐波拉契数列,然后数列的每个值都乘以2,在把乘以2的数列用另外一个消费者打印出来·

分析:

1.生产者1:生成斐波拉契数列

2.消费者1:消费数列 并生成改变值的数列

3.消费者2:消费新的数列

func produce(start, count int, ch chan<- int) {
	defer close(ch)
	for i := 0; i < count; i++ {
		ch <- start + i
	}
}

func consumeAndProduce(ch <-chan int, fibChan chan<- []int) {
	defer close(fibChan)
	for n := range ch {
		fibChan <- fi(n)
	}
}

func consumer(fibChan <-chan []int, wg *sync.WaitGroup) {
	defer wg.Done()
	for fibSlice := range fibChan {
		doubleSlice := make([]int, len(fibSlice))
		for i, v := range fibSlice {
			doubleSlice[i] = v * 2
		}
		fmt.Println(doubleSlice)
	}
}

简单的斐波那契数列通过chan实现生产者消费者模型_斐波那契数列_02

注意关闭chan,不然一直消费者一直读不到数据会死锁

简单的斐波那契数列通过chan实现生产者消费者模型_斐波拉契数列_03

       3.主函数


func main() {
	var wg sync.WaitGroup
	ch := make(chan int)
	fibCh := make(chan []int)
	wg.Add(1)
	go produce(8, 15, ch)
	go consumeAndProduce(ch, fibCh)
	go consumer(fibCh, &wg)
	wg.Wait()
}

正确运行

简单的斐波那契数列通过chan实现生产者消费者模型_斐波拉契数列_04

4.总结

本案例主要学习了斐波那契数列是什么,以及如何运用chan实现生产者消费者模型,简单的例子大大的学问,希望看过这篇文章的人对chan有了更深的理解,也祝大家2024新年愉快

标签:wg,数列,int,chan,fibs,斐波,那契,消费者
From: https://blog.51cto.com/u_12040959/9638757

相关文章

  • Mechanism of Machine Learning
    1.WhatisMachineLearning?MachineLearning=StatisticLearning,namely,thereisanunknowndistributionof(x1,x2,...,xm,y),thetaskistoinferywhen(x1,x2,...,xm)isknown,Althoughthedistributionisunknown,sotherelationbetween(x1,......
  • [ Go] GoRoutines and Channels
    AgoroutineistheGowayofsuingthreads,weopenagoroutinejustbyinvokinganyfunctionwithagoprefix.gofunctionCall()Goroutinescancommunicatethroughchannels,anspecialtypeofvariable,achannelcontainsavalueofanykind,aroutinec......
  • python发送、接收exchange邮件
    导包importdatetimefrompathlibimportPathimportpytzfromexchangelibimportConfiguration,Account,DELEGATE,Q,Credentials,HTMLBody,Message,FileAttachmentfromexchangelib.protocolimportCachingProtocol连接邮箱server='example.com'do......
  • 斐波拉楔表示法
    这道题目真就离谱,我只能说见识一下这一点我是想到的,注意斐波那契数列增长的非常快这一点我没有想到,但好像并没有什么用这玩意我也想到的,但是完全无法证明,说实话只能猜这些我也都想到了,但是显然DP数组太大了承受不了,怎么办?好家伙我直呼好家伙,这时间复杂度谁能给我算算?......
  • Golang 向已关闭的chan读写数据会怎样
    1.向已关闭的chan写会直接panic,报sendtoclosechannel错误packagemainfuncmain(){ //创建缓冲区为4的字符串chan schoolChan:=make(chanstring,4) //放入3个值 schoolChan<-"国防科大" schoolChan<-"北京大学" schoolChan<-"湖南大学" //......
  • -bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
    问题ssh刚登录连接时警告:Failedtosetlocale,defaultingtoC或2.linux运行命令时先报错:Failedtosetlocale,defaultingtoC系统已经设置了默认地区_语言.字符集为en_US.UTF-8,但是在系统中没有定义对应的locale文件,只需要手动生成这个locale文件即可解决:查......
  • 代码随想录 da38 斐波那契数 爬楼梯 使用最小花费爬楼梯
    斐波那契数本题非常简单只是熟悉动态规划的基本流程爬楼梯本题是上题的略微扩展,本题没有明确给出状态转移方程和初始值这里的想法是到第i层需要先到第i-1层或者第i-2层那么实际上第i层的到达方法数就是第i-1层和第i-2层的到达方法数的和使......
  • 斐波那契周期性
    斐波那契周期性定义\[Fib_1=1,Fib_2=1,Fib_n=Fib_{n-2}+Fib_{n-1}\]有通项公式:\[Fib_n=\frac{1}{\sqrt5}\left(\left(\frac{1+\sqrt5}{2}\right)^n-\left(\frac{1-\sqrt5}{2}\right)^n\right)\]周期的计算引理1对于奇素数\(p\equiv1\pmod5\)或\(p\equiv4\pmod5......
  • wpf 数据绑定 INotifyPropertyChanged封装
    BindableBase.cspublicabstractclassBindableBase:INotifyPropertyChanged{publiceventPropertyChangedEventHandlerPropertyChanged;//调用方法:publicstringName{get=>name;set{SetProperty<string>(refname,value);}}......
  • no new changes
    nonewchangeshttps://gerrit-documentation.storage.googleapis.com/Documentation/2.16.4/error-no-new-changes.htmlWiththiserrormessageGerritrejectstopushacommitifthepushedcommitwasalreadysuccessfullypushedtoGerritinprojectscope.In......