Задача

Завершено

Для выполнения этой задачи необходимо улучшить существующую программу, ускорив ее работу. Попробуйте написать программы самостоятельно, даже если для этого вам необходимо вернуться и свериться с примерами, которые использовались для закрепления знаний на практике. Затем сравните решение с тем, который у нас есть в следующем уроке.

Параллелизм в Go — сложная тема, которую проще понять на практике. Эта задача — лишь одна из возможностей его применения.

Удачи!

Ускоренное вычисление чисел Фибоначчи с помощью параллелизма

Используйте следующую программу для последовательного вычисления чисел Фибоначчи.

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

На основе этого имеющегося кода необходимо создать две программы.

  • Улучшенная версия, в которой реализован параллелизм. Выполнение должно длиться несколько секунд (не более 15 секунд), как сейчас. Следует использовать буферизованные каналы.

  • Напишите новую версию, которая вычисляет числа Fibonacci, пока пользователь не войдет quit в терминал с помощью fmt.Scanf() функции. Если пользователь нажмет клавишу ВВОД, следует вычислить новое число Фибоначчи. Иными словами, у вас больше нет цикла от 1 до 10.

    Используйте два небуферизованных канала: один для вычисления числа Фибоначчи, а другой для ожидания сообщения "quit" от пользователя. Воспользуйтесь оператором select.

Ниже приведен пример взаимодействия с программой.

1

1

2

3

5

8

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