과제

완료됨

이 과제를 풀려면 기존 프로그램이 더 빨리 실행되도록 개선해야 합니다. 뒤로 돌아가 연습에 사용한 예제를 확인해야 하는 경우에도 직접 프로그램을 작성해 보세요. 그런 다음 여러분이 도출한 솔루션을 다음 단원에 나와 있는 솔루션과 비교해 보세요.

Go의 동시성은 복잡한 문제이므로 연습을 해야 더 잘 이해할 수 있습니다. 이 과제를 통해 연습으로 할 수 있는 것을 알게 됩니다.

행운을 빕니다!

동시성을 사용하여 피보나치 수를 더 빠르게 계산하기

다음 프로그램을 사용하여 피보나치 수를 순차적으로 계산합니다.

package main

import (
    "fmt"
    "math/rand"
    "time"
)

func fib(number float64) float64 {
    x, y := 1.0, 1.0
    for i := 0; i < int(number); i++ {
        x, y = y, x+y
    }

    r := rand.Intn(3)
    time.Sleep(time.Duration(r) * time.Second)

    return x
}

func main() {
    start := time.Now()

    for i := 1; i < 15; i++ {
        n := fib(float64(i))
    fmt.Printf("Fib(%v): %v\n", i, n)
    }

    elapsed := time.Since(start)
    fmt.Printf("Done! It took %v seconds!\n", elapsed.Seconds())
}

이 기존 코드에서 두 개의 프로그램을 만들어야 합니다.

  • 동시성을 구현하는 향상된 버전입니다. 지금은 완료하는 데 몇 초 정도 걸립니다(15초 이하). 버퍼 있는 채널을 사용해야 합니다.

  • 사용자가 터미널에서 fmt.Scanf() 함수를 사용하여 quit를 입력할 때까지 피보나치 수를 계산하는 새 버전을 작성합니다. 사용자가 Enter 키를 누르면 새 피보나치 수를 계산해야 합니다. 즉, 1부터 10까지의 루프가 없어집니다.

    버퍼 없는 채널 두 개를 사용합니다. 하나는 피보나치 수를 계산하고 다른 하나는 사용자의 ‘종료’ 메시지를 기다릴 때 사용합니다. select 문을 사용해야 합니다.

프로그램과의 상호작용 예는 다음과 같습니다.

1

1

2

3

5

8

13
quit
Done calculating Fibonacci!
Done! It took 12.043196415 seconds!