RosettaCodeData/Task/Feigenbaum-constant-calculation/Scala/feigenbaum-constant-calculation-2.scala
2023-07-01 13:44:08 -04:00

34 lines
984 B
Scala

object Feigenbaum2 extends App {
private val (max_it, max_it_j) = (13, 10)
private def result = {
@scala.annotation.tailrec
def outer(i: Int, d1: Double, a2: Double, a1: Double, acc: Seq[Double]): Seq[Double] = {
@scala.annotation.tailrec
def center(j: Int, a: Double): Double = {
@scala.annotation.tailrec
def inner(k: Int, end: Int, x: Double, y: Double): (Double, Double) =
if (k < end) inner(k + 1, end, a - x * x, 1.0 - 2.0 * y * x) else (x, y)
val (x, y) = inner(0, 1 << i, 0.0, 0.0)
if (j < max_it_j) {
center(j + 1, a - (x / y))
} else a
}
if (i <= max_it) {
val a = center(0, a1 + (a1 - a2) / d1)
val d: Double = (a1 - a2) / (a - a1)
outer(i + 1, d, a1, a, acc :+ d)
} else acc
}
outer(2, 3.2, 0, 1.0, Seq[Double]()).zipWithIndex
}
println(" i ≈ δ")
result.foreach { case (δ, i) => println(f"${i + 2}%2d %.8f") }
}