En la function kotlin android tailrec devuelve 0

Traté de usar este tutorial de youtube tutorial . Tengo una function de la siguiente manera:

fun fact(x:Int):Int{ tailrec fun factTail(y:Int, z:Int):Int{ return if(y == 0) { z } else { factTail(y - 1, y * z) } } return factTail(x,1) } 

y esta function se llama oncreate como:

 var abc = fact(5) Log.i(TAG, "5! = $abc") 

Cuando la aplicación genera el logging, se muestra así:

 I/MainActivity: 5! = 0 

¿Alguien puede señalar lo que está mal aquí?

Tu código es correcto y definitivamente obtienes 0 para resultados múltiples más de MAX_SIZE de valor Int . Puede get el tamaño máximo de Int con:

 Int.MAX_VALUE 

Por lo tanto, si este y * x cruza Int.MAX_VALUE = 2147483647 , la diversión devolverá 0 a usted. Para un número mayor a 16, func devolverá less el número y para más de 33 devolverá 0 . puedes verificar esto por:

 for(x in 5..50){ log.i("$x! : ${fact(x)}") } 

Para que pueda manejar esto cambiando la variable de Int a Long

 fun fact(x : Long) : Long { fun factTail(y : Long , z :Long):Long { return if (y == 0L) z else return factTail(y-1 ,y*z) } return factTail(x ,1) } 

Pero Long también tiene su limitación. Espero que entiendas el punto.