2017-10-16 143 views
2

我試着用這個教程youtube tutorial。我有一個函數如下:在kotlin android tailrec函數返回0

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

我用你提供的代碼試了一下,得到了'5! = 120'。 – marstran

+0

相同。得到了'5! = 120'。 –

+0

同樣,我得到了'5! = 120'在kotlin REPL – crgarridos

回答

1

你的代碼是正確的,你一定得到多個結果超過MAX_SIZE 詮釋值。你可以得到詮釋最大尺寸有:

Int.MAX_VALUE 

因此,如果這是* x橫Int.MAX_VALUE = 2147483647,樂趣將返回給你。 對於大於的數字16 func將返回負號並且大於它將返回。您可以通過檢查:

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

所以,你可以通過從int變量變化對龍

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

但龍也有其侷限性處理這個問題。希望你明白這一點。