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