Desafio
Para este desafio, você precisa melhorar um programa existente, tornando-o executado mais rápido. Tente escrever os programas por conta própria, mesmo que você tenha que voltar e verificar os exemplos que você costumava praticar. Depois, compare a sua solução com a que temos na próxima unidade.
A simultaneidade em Go é um problema complexo que você entenderá melhor quando praticar. Este desafio é apenas uma ideia do que você pode fazer para praticar.
Boa sorte!
Calcule os números de Fibonacci mais rapidamente com simultaneidade
Use o seguinte programa para calcular os números de Fibonacci de forma 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 criar dois programas a partir deste código existente:
Uma versão melhorada onde você implementa simultaneidade. Deve levar alguns segundos para terminar (não mais de 15 segundos), como acontece agora. Você deve usar canais em buffer.
Escreva uma nova versão que calcule os números de Fibonacci até que o usuário entre
quit
no terminal usando afmt.Scanf()
função. Se o usuário pressionar Enter, você deve 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 "quit" do usuário. Você precisará usar a
select
declaração.
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!