Fibonacci

Code

package com.glassthought.sandbox

import gt.sandbox.util.output.print
import gt.sandbox.util.output.printGreen
import gt.sandbox.util.output.println
import kotlinx.coroutines.runBlocking
import java.math.BigDecimal


// Declare a sequence of Fibonacci numbers, using BigDecimal
// to handle large values.
val fibonacci: Sequence<BigDecimal> = sequence {
  // Initialize the first two Fibonacci numbers.
  var current = 1.toBigDecimal()  // Current number in the sequence
  var prev = 1.toBigDecimal()     // Previous number in the sequence

  // Emit the first Fibonacci number (1).
  yield(prev)

  // Use an infinite loop to generate subsequent numbers.
  while (true) {
    // Emit the current Fibonacci number.
    yield(current)

    // Compute the next Fibonacci number by adding the previous two numbers.
    val temp = prev        // Temporarily store the previous number
    prev = current         // Update the previous number to the current one
    current += temp        // Update the current number to the sum of current and previous
  }
}

fun main() = runBlocking {
  fibonacci.take(10).toList().println()

  System.out.flush()
}

Command to reproduce:

gt.sandbox.checkout.commit d48a6563eadebbd18ccf \
&& cd "${GT_SANDBOX_REPO}" \
&& cmd.run.announce "./gradlew run --quiet"

Recorded output of command:

[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

Backlinks