Desafio
Para esse desafio, você precisa aprimorar um programa existente fazendo com que ele seja executado mais rapidamente. Tente escrever os programas por conta própria, mesmo que precise voltar e verificar os exemplos que você usou para praticar. Em seguida, compare a solução com a apresentada na próxima unidade.
A simultaneidade no Go é um problema complexo que você entenderá melhor ao praticar. Esse desafio é apenas uma ideia do que você pode fazer para praticar.
Boa sorte!
Calcular números de Fibonacci mais rapidamente com simultaneidade
Use o seguinte programa para calcular os números de Fibonacci de modo sequencial:
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())
}
Você precisa compilar dois programas usando este código:
Uma versão aprimorada na qual você implementa a simultaneidade. Devem ser necessários alguns segundos para terminar (não mais de 15 segundos), como agora. Você deve usar canais em buffer.
Escreva uma nova versão que calcule os números de Fibonacci até que o usuário insira
quit
no terminal usando a funçãofmt.Scanf()
. Se o usuário pressionar Enter, você deverá calcular um novo número de Fibonacci. Em outras palavras, você não terá mais um loop de 1 a 10.Use dois canais sem buffer: um para calcular o número de Fibonacci e outro que está aguardando a mensagem "encerrar" do usuário. Você precisará usar a instrução
select
.
Aqui está um exemplo da interação com o programa:
1
1
2
3
5
8
13
quit
Done calculating Fibonacci!
Done! It took 12.043196415 seconds!