在kotlin android tailrec函数返回0
我试图用这个教程YouTube教程 。 我有一个function如下:
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
任何人都可以指出这里有什么问题。
你的代码是正确的,你肯定得到多于MAX_SIZE的Int值的多个结果为0 。 您可以通过以下方式获得Int max大小:
Int.MAX_VALUE
所以如果这个y * x越过Int.MAX_VALUE = 2147483647
,fun就会返回0给你。 对于大于16的数字,func将返回负数,大于33则返回0 。 你可以检查这个:
for(x in 5..50){ log.i("$x! : ${fact(x)}") }
所以你可以通过改变variables从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) }
但龙也有其局限性。 希望你明白这一点。