私はgolangでn個のgoroutinesを使ってチャネル経由で通信するフィボナッチ再帰を実装しようとしています。はn個のゴルーチンと通信します
私は関数から整数を返していますが、実際にはf(n-1)+ f(n-2)の合計をチャネルCで送信していますが、これは正しく動作しません。それは正しい最初の2つの値を印刷し、すべての値が後ちょうど1
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)
}
}
である。また、それは、二つの再帰呼び出しを受信するためのチャネルを使用することは可能でしょうか?
'<-procchan'にアクセスしている場合は、値を持ってから続行するまでチャンネルを待っていません。そうすればforループはシーケンシャル実行と同じですね。 –
はいこれは順次と同じです。 1つのゴルーチンを起動し、最初の結果を待って結果を表示し、別の結果を表示します。問題はあなたのgoroutinesが各回帰のチャンネルで値を返すことです。f(2)を呼び出す前にf(2)を呼び出すと、f(1)とfその前にチャンネルに値を入力します。そして、あなたが問題を引き起こす最初の価値を握っているだけなので。 – nissefors
@NanduKalidindi申し訳ありませんが、私は明確にユーザー名を確認せず、あなたが3rdeye7のように応答しました – nissefors