2017-10-30 3 views
4
fun fact(x: Int): Int{ 
    tailrec fun factTail(y: Int, z: Int): Int{ 
     if (y == 0) return z 
     else return factTail(y - 1, y * z) 
    } 
    return factTail(x, 1) 
} 

誰かに私の説明をしてもらえますか?上記の再帰関数はどのようにkotlinで機能しますか?コトリン再帰

+1

Kotlinの 'tailrec'は、関数オーバーフローを防止します。この修飾子は、最適化のためにコンパイラによって使用されます。 –

+3

私は、「関数階級」がコトリンの言葉で「楽しい事実」に変わるのが好きです。 – bipll

答えて

1

tailrecキーワードは、stack overflowのリスクを回避して再帰ではなくループで関数を表現しようとするコンパイラの最適化としてのみ使用されることになります。

我々は再帰を避ける場合は、この関数は次のようなものになります:

fun fact(x: Int): Int { 
    var result = x 
    for (i in x - 1 downTo 1) { 
     result *= i 
    } 
    return result 
} 
4

あなたはstackoverflowのあるkotlinで再帰を使用するときには大きなリスクがあります。上記画像再帰として

stack

はkotlinに働きます。スタックの最大サイズがあります。再帰関数が無限に進むと、最大サイズを超え、StackOverflow例外が発生します。したがって、再帰とループの使用を避けてください。

+0

あなたが言及しているそのリスクは、コトリンに限られているわけではありません。 – Enzokie