2017-11-22 14 views
1

채널을 통해 통신하는 n goroutines를 사용하여 golang에서 fibonacci 재귀를 구현하려고합니다.n goroutines와 통신

함수에서 정수를 반환하지만 실제로 f (n-1) + f (n-2)의 합계를 채널 C로 보냈지 만 올바르게 작동하지 않습니다. 이것은 올바른 처음 두 값을 출력하고, 각 값은 이후 단지 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) 
} 
} 

또한 두 재귀 호출을 수신하기위한 채널을 사용하는 것이 가능하다?

답변

2

솔루션은 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 
... 

각 난에 대한 새 채널을 만든 다음 하나 개의 값을 추출하기 때문에 항상 위 라인의 첫 번째 값을 얻을 것이다.

이러한 수정으로 실행하려고하면 원하는 것을 출력합니다 (https://play.golang.org/p/_mn3l5x8iZ). @nissefors에 추가

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) 
    } 

} 
+0

'<-procchan'에 접근하고 있다면 값이 있고 계속 진행될 때까지 채널을 기다리는 중입니까? 그런 식으로 for 루프는 순차 실행과 동일하지 않습니까? –

+0

예 순차와 동일합니다. tou는 하나의 goroutine을 시작하고 첫 번째 결과를 기다리고 그 결과를 출력 한 다음 다른 결과를 시작합니다. 문제는 goroutines가 각 재귀의 채널에서 값을 반환한다는 것입니다. 따라서 f (2) 호출이 채널에 값을 넣기 전에 f (2)를 호출 할 때 차례대로 모든 f (1) 및 f (0) 채널에 값을 넣습니다 그 전에 채널에 값을 입력하십시오. 그리고 당신이 문제를 일으키는 첫 번째 가치만을 붙잡고 있기 때문에. – nissefors

+0

@ NanduKalidindi 미안하지만, 분명히 사용자 이름을 확인하지 못했고, 당신이 3hdeye7 – nissefors

1

주 과정으로 인해 루프는 반환하고 다음 반복으로 진행하는 채널에서 기다리고있을 것입니다에서 가장 가능성이 순차적 하나가 대답. https://play.golang.org/p/7e3JnWeSp6

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]) 
    } 

} 
:

루프에 대해 별도의에서 한 번에 다음 각각에 대응하는 채널을 모든 fibonaccis을 발사 할 수있는 주요 기능에 약간의 수정 루틴이

놀이터 URL을 액세스 할 수 있습니다 이동