我尝试使用本教程youtube tutorial。我的功能如下:
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)
}
并在oncreate中调用此函数:
var abc = fact(5)
Log.i(TAG, "5! = $abc")
当应用输出日志时,它显示如下:
I/MainActivity: 5! = 0
任何人都可以指出这里有什么问题。
答案 0 :(得分:1)
你的代码是正确的,你肯定得到 0 多于 Int 值 MAX_SIZE 的多个结果。您可以通过以下方式获得Int max size:
Int.MAX_VALUE
因此,如果这个y * x交叉Int.MAX_VALUE = 2147483647
,乐趣会向您返回 0 。
对于大于 16 的数字,func将返回减号,对于大于 33 ,它将返回 0 。你可以通过以下方式检查:
for(x in 5..50){
log.i("$x! : ${fact(x)}")
}
因此,您可以通过将变量从Int更改为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)
}
但龙也有其局限性。希望你明白这一点。