在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_SIZEInt值的多个结果为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) } 

但龙也有其局限性。 希望你明白这一点。