在kotlin中,android tailrec函数返回0

时间:2017-10-16 06:00:19

标签: android kotlin tail-recursion

我尝试使用本教程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

任何人都可以指出这里有什么问题。

1 个答案:

答案 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)
   }

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