Desafío
Para este desafío, debe mejorar un programa consiguiendo que se ejecute más rápido. Intente escribir los programas por su cuenta, incluso si tiene que volver atrás y consultar los ejemplos que usó para practicar. Después, compare la solución con la de la unidad siguiente.
La simultaneidad en Go es un problema complejo que entenderá mejor cuando practique. Este desafío es solo una idea de lo que puede hacer para practicar.
Buena suerte.
Cálculo de los números Fibonacci más rápido con simultaneidad
Use el siguiente programa para calcular los números Fibonacci de una manera secuencial:
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())
}
Debe compilar dos programas a partir de este código:
Una versión mejorada en la que se implementa la simultaneidad. Debería tardar unos segundos en finalizar (no más de 15), como hace ahora. Debe usar canales almacenados en búfer.
Escriba una nueva versión que calcule los números Fibonacci hasta que el usuario escriba
quit
en el terminal mediante la funciónfmt.Scanf()
. Si el usuario presiona Intro, debe calcular un nuevo número Fibonacci. En otras palabras, ya no tendrá un bucle de 1 a 10.Use dos canales no almacenados en búfer: uno para calcular el número Fibonacci y otro que esté esperando el mensaje "quit" del usuario. Tendrá que usar la instrucción
select
.
A continuación se muestra un ejemplo de la interacción con el programa:
1
1
2
3
5
8
13
quit
Done calculating Fibonacci!
Done! It took 12.043196415 seconds!