与n个goroutine通信
我试图在golang中使用n个通过通道通信的goroutine实现斐波那契递归 我从函数返回一个整数,但实际上我只是通过通道c发送f(n-1)+f(n-2)之和,但这不能正常工作。它正确地打印前两个值,之后的每个值仅为1与n个goroutine通信,go,concurrency,Go,Concurrency,我试图在golang中使用n个通过通道通信的goroutine实现斐波那契递归 我从函数返回一个整数,但实际上我只是通过通道c发送f(n-1)+f(n-2)之和,但这不能正常工作。它正确地打印前两个值,之后的每个值仅为1 package main import "fmt" // Fibonacci in a recursive version func fiboR(n int, c chan int ) int { if(n == 0){ c <- 0 r
package main
import "fmt"
// Fibonacci in a recursive version
func fiboR(n int, c chan int ) int {
if(n == 0){
c <- 0
return 0
} else if n == 1 {
c <- 1
return 1
} else{
c <- fiboR(n-1,c) + fiboR(n-2,c)
return fiboR(n-1,c) + fiboR(n-2,c)
}
}
func main() {
for i := 0; i < 10; i++ {
procchan := make(chan int)
go fiboR(i,procchan)
fmt.Println(i,<-procchan )
}
}
主程序包
输入“fmt”
//递归版本中的斐波那契
函数fiboR(n int,c chan int)int{
如果(n==0){
c当增加i的值时,您的解决方案将尝试输出多个从通道中提取的值。
您的代码将尝试为每个i向通道发送的内容:
0: 0
1: 1
2: 1,0,1
3: 1,0,1,1,2
4: 1,0,1,1,2,1,0,1,3
...
由于您为每个i创建一个新通道,然后只提取一个值,因此您将始终获得上面一行中的第一个值
如果您尝试使用这些修改运行它,它将输出您想要的()
主程序包
输入“fmt”
//递归版本中的斐波那契
func fiboRchan(n int,c chan int){
c加上@nissefors答案,那里的主要过程很可能是一个连续的过程,因为在for循环中,您将等待通道返回,然后继续下一个迭代
主功能中的一个小修改可以一次触发所有fibonaccis,然后在一个单独的for循环中,可以访问对应于每个go例程的通道
游乐场网址:
主程序包
输入“fmt”
//递归版本中的斐波那契
func fiboRchan(n int,c chan int){
fmt.Println(“处理%d”,n)
c如果您正在访问Yes,它与sequential相同;t启动一个goroutine,等待它的第一个结果,打印它的结果,然后启动另一个goroutine。问题是您的goroutines在每个递归中都返回通道上的值,因此,当您在f(2)调用之前调用f(2)时,将其值放入通道上时,所有的f(1)和f(0)在这之前,每个人依次将他们的值放到频道上。而且由于您只获取导致问题的第一个值。@NanduKalidindi抱歉,我显然没有检查用户名,并且响应时就好像您在3rdeye7中一样
package main
import "fmt"
// Fibonacci in a recursive version
func fiboRchan(n int, c chan int) {
c <- fiboR(n)
}
func fiboR(n int) int {
if n == 0 {
return 0
} else if n == 1 {
return 1
} else {
return fiboR(n-1) + fiboR(n-2)
}
}
func main() {
for i := 0; i < 10; i++ {
procchan := make(chan int)
go fiboRchan(i, procchan)
fmt.Println(i, <-procchan)
}
}
package main
import "fmt"
// Fibonacci in a recursive version
func fiboRchan(n int, c chan int) {
fmt.Println("PROCESSING FOR %d", n)
c <- fiboR(n)
}
func fiboR(n int) int {
if n == 0 {
return 0
} else if n == 1 {
return 1
} else {
return fiboR(n-1) + fiboR(n-2)
}
}
func main() {
var arr[10]chan int
for i := 0; i < 10; i++ {
procchan := make(chan int)
arr[i] = procchan
go fiboRchan(i, procchan)
}
// By now all the go routines are fired
// Now iterate through the channel array and read from the
// respective channel
for i:=0; i< 10; i++ {
fmt.Println(i, <-arr[i])
}
}