본문 바로가기

IT/Go 언어 (Golang)

[Golang] 고루틴과 채널(chan)을 이용한 피보나치 수열

반응형

이번에는 고루틴과 채널을 이용하여 피보나치 수열을 생성하는 함수를 만들어보자.

 

소스 코드는 다음과 같다.

// Go Fib

package main

import "fmt"

func Fib(max uint64) <-chan uint64 {
	ch := make(chan uint64)
	go func() {
		defer close(ch)
		var a, b uint64
		a, b = 0, 1
		for a <= max {
			ch <- a
			a, b = b, a+b
		}
	}()
	return ch
}

func FibGenerator(max uint64) func() uint64 {
	var next, a, b uint64
	next, a, b = 0, 0, 1
	return func() uint64 {
		next, a, b = a, b, a+b
		if next > max {
			return 0
		}
		return next
	}
}

func main() {
	for fib := range Fib(9999999999999999999) {
		fmt.Print(fib, ", ")
	}
	fmt.Println("END!")
}

소스 코드는 매우 간단하며 동시에 매우 강력하다.

고루틴과 채널의 강점을 잘 활용하는 예제라 볼 수 있다.

 

실행 결과는 다음과 같다.

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 
1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 
196418, 317811, 514229, 832040, 1346269, 2178309, 3524578, 5702887, 
9227465, 14930352, 24157817, 39088169, 63245986, 102334155, 165580141, 
267914296, 433494437, 701408733, 1134903170, 1836311903, 2971215073, 
4807526976, 7778742049, 12586269025, 20365011074, 32951280099, 53316291173, 
86267571272, 139583862445, 225851433717, 365435296162, 591286729879, 
956722026041, 1548008755920, 2504730781961, 4052739537881, 6557470319842, 
10610209857723, 17167680177565, 27777890035288, 44945570212853, 72723460248141, 
117669030460994, 190392490709135, 308061521170129, 498454011879264, 806515533049393, 
1304969544928657, 2111485077978050, 3416454622906707, 5527939700884757, 8944394323791464, 
14472334024676221, 23416728348467685, 37889062373143906, 61305790721611591, 
99194853094755497, 160500643816367088, 259695496911122585, 420196140727489673, 
679891637638612258, 1100087778366101931, 1779979416004714189, 2880067194370816120, 
4660046610375530309, 7540113804746346429, END!
Process exiting with code: 0

실행 속도는 0.817 sec 정도이다. (VS Code 기준)

고루틴의 위엄이 얼마나 대단한지 알 수 있다.

반응형