¿Cómo evitar el error de StackOverFlow en Java / Kotlin / IntelliJ IDEA?

Quiero hacer un factorial de un BigInteger (en Kotlin). ¡Con una repetición de queue, recibo el error de StackOverFlow cuando bash hacer 9000! . Con una function no recursiva puedo hacerlo … pero tengo mucha curiosidad sobre cómo evitar este tipo de error.

Aquí está mi código:

import java.math.BigInteger fun tail_recursion_factorial(n: BigInteger, factorialOfN: BigInteger = BigInteger.valueOf(2)): BigInteger { return when(n){ BigInteger.ONE -> BigInteger.ONE BigInteger.valueOf(2) -> factorialOfN else -> tail_recursion_factorial(n.minus(BigInteger.ONE), n.times(factorialOfN)) } } fun non_recursive_factorial(n: BigInteger): BigInteger{ var i: BigInteger = BigInteger.ONE var factorial: BigInteger = BigInteger.ONE while (i<=n){ factorial = factorial.times(i) i = i.plus(BigInteger.ONE) } return factorial } fun main(args: Array<String>){ print("n == ") var n = readLine()!! //recursive //println("$n! is ${tail_recursion_factorial(BigInteger(n))}") //non-recursive println("$n! is ${non_recursive_factorial(BigInteger(n))}") } 

Este es un problema que debe resolverse en el nivel de idioma, porque la JVM no optimiza la recursion de queue.

Afortunadamente, el lenguaje Kotlin proporciona un modificador tailrec para exactamente este propósito, por lo que simplemente puede escribir la tailrec fun lugar de fun . El comstackdor convertirá las llamadas de queue dentro de una function tailrec en loops, lo que debería eliminar el desbordamiento de stack que está experimentando.