Desafio

Concluído

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ção fmt.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!