Почему выходные данные хвостового рекурсивного факториала равны нулю для больших входов? - PullRequest
0 голосов
/ 09 января 2020

Я новичок в обучении Kotlin. Я пытаюсь использовать хвостовую рекурсию для вычисления факториала в моем коде, но когда я ввожу 99999, вывод будет 0. Вот мой код:

fun main(){
    println(factTailRec(99999))
}
tailrec fun factTailRec(number: Int, result: Int = 1): Long{
    return if(number.toInt() == 1){
        result.toLong()
    } else {
        factTailRec(number-1, result*number)
    }
}

1 Ответ

1 голос
/ 09 января 2020

Ваш result типа Int недостаточен для хранения фактического результирующего значения. Вам нужно что-то вроде BigInteger:

import java.math.BigInteger
import java.math.BigInteger.ONE


inline operator fun BigInteger.times(other: Int): BigInteger =
    this.multiply(BigInteger.valueOf(other.toLong()))

tailrec fun factTailRec(number: Int, result: BigInteger = ONE): BigInteger {
    return if (number == 1) {
        result
    } else {
        factTailRec(number - 1, result * number)
    }
}

fun main() {
    println(factTailRec(99999)) // 28242294079...
}
...