Uppgift

Slutförd

För den här utmaningen måste du förbättra ett befintligt program genom att köra det snabbare. Försök att skriva programmen på egen hand, även om du måste gå tillbaka och kontrollera de exempel som du använde för att öva. Jämför sedan din lösning med den vi har i nästa lektion.

Samtidighet i Go är ett komplext problem som du förstår bättre när du övar. Den här utmaningen är bara en uppfattning om vad du kan göra för att öva.

Lycka till!

Beräkna Fibonacci-tal snabbare med samtidighet

Använd följande program för att beräkna Fibonacci-tal på ett sekventiellt sätt:

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())
}

Du måste skapa två program från den här befintliga koden:

  • En förbättrad version där du implementerar samtidighet. Det bör ta några sekunder att slutföra (högst 15 sekunder), som det gör nu. Du bör använda buffrade kanaler.

  • Skriv en ny version som beräknar Fibonacci-tal tills användaren kommer in quit i terminalen med hjälp fmt.Scanf() av funktionen. Om användaren trycker på Retur bör du beräkna ett nytt Fibonacci-nummer. Med andra ord har du inte längre en loop från 1 till 10.

    Använd två obuffertade kanaler: en för att beräkna Fibonacci-talet och en annan som väntar på meddelandet "avsluta" från användaren. Du måste använda -instruktionen select .

Här är ett exempel på interaktionen med programmet:

1

1

2

3

5

8

13
quit
Done calculating Fibonacci!
Done! It took 12.043196415 seconds!