Desafio

Concluído

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 a fmt.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!