課題

完了

この課題の場合、既存のプログラムをより高速に実行して改善する必要があります。 前に戻って実習で使用した例を確認する必要がある場合でも、自分でプログラムを作成してみてください。 次に、自分のソリューションを次のユニットのソリューションと比較します。

Go のコンカレンシーは複雑な問題であり、実践すると理解が深まります。 この課題は、実践する上で何ができるかについての 1 つのアイデアにすぎません。

幸運をお祈りします!

コンカレンシーを使用してフィボナッチ数をより速く計算する

次のプログラムを使用して、フィボナッチ数を順番に計算します。

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

この既存のコードから 2 つのプログラムをビルドする必要があります。

  • コンカレンシーを実装する改良バージョン。 現時点では、かかる時間は数秒 (15 秒以内)のはずです。 バッファーありのチャネルを使用する必要があります。

  • ユーザーが fmt.Scanf() 関数を使用してターミナルに quit と入力するまでフィボナッチ数を計算する新しいバージョンを作成します。 ユーザーが Enter キーを押した場合は、新しいフィボナッチ数を計算する必要があります。 つまり、1 から 10 までのループはなくなります。

    2 つのバッファーなしチャネルを使用します。1 つはフィボナッチ数を計算するためのものであり、もう 1 つはユーザーからの "終了" メッセージを待機するためのものです。 select ステートメントを使用する必要があります。

プログラムとの相互作用の例を次に示します。

1

1

2

3

5

8

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