Skip to content

bullet-true/kotlin-coroutines

Repository files navigation

Fibonacci

Задание: вычисление n-го числа из ряда Фибоначчи

Цели практической работы

  • Закрепить на практике работу с корутинами.
  • Создать приостанавливаемые функции.
  • Научиться запускать и прерывать исполнение корутин.

Что нужно сделать

Напишите программу, которая вычисляет n-е число из ряда Фибоначчи. Вы уже сталкивались с задачей о числах Фибоначчи при изучении циклов. Теперь вам необходимо доработать существующий код или написать программу заново с использованием корутин.

Алгоритм выполнения задачи:

  1. Создайте объект-синглтон Fibonacci.

  2. В этом объекте создайте suspend функцию take. Функция принимает на вход число — номер в последовательности Фибоначчи — и возвращает рассчитанное число типа BigInteger. Для создания числа BigInteger используйте функцию-расширение toBigInteger.

  3. Запустите две или более корутин в функции main. Используйте для этого функцию runBlocking и билдер launch. Внутри каждой корутины вызовите функцию take и выведите результат в консоль.

  4. Рассчитайте несколько чисел Фибоначчи в порядке возрастания, затем в порядке убывания. Запустите программу несколько раз и проанализируйте порядок работы корутин.

Например: По возрастанию:

launch { take(5) }
launch { take(10) } 
launch { take(15) }
  1. Сделайте suspend функцию take отменяемой. Используйте для этого функцию yield. Или функцию currentCoroutineContext и его расширение isActive.

Например:

currentCoroutineContext().isActive

При необходимости выполнение функции должно прерываться. Точки прерывания определите самостоятельно, исходя из реализации вашей функции.

  1. Запустите программу ещё несколько раз и вновь проанализируйте порядок работы корутин.

  2. Отмените выполнение функции take при превышении какого-то времени. Используйте для этого функцию withTimeout.

Например:

withTimeout(3000) {
    // some code
}
  • Запускает блок кода на выполнение и прерывает его выполнение при превышении 3-х секунд.

    Числа в цикле рассчитываются быстро, поэтому, чтобы отмена по таймауту была заметна, необходимо рассчитывать числа из последовательности Фибоначчи с довольно большим порядковым номером. Использование цикла вместо рекурсии и BigInteger вместо Long избавит от переполнения типа данных и переполнения стека.

  1. При отмене по таймауту выбрасывается исключение TimeoutCancellationException. Обработайте это исключение и выведите в консоль сообщение о превышении времени вычисления.

  2. Запустите ещё одну корутину, которая будет индикатором вычислений и выведет точки в консоль. Эта корутина должна работать до тех пор, пока идут вычисления всех ваших чисел Фибоначчи.

  • По желанию: Добейтесь, чтобы вывод рассчитанных значений происходил после того, как будут рассчитаны все числа. Тем самым числа будут рассчитываться параллельно, но индикатор прогресса (точки) не будет прерываться сообщениями о рассчитанном числе.

Можно использовать для этого Job и функцию join.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages