Hace tiempo me topé con un modificador llamado tailrec. ¿Que hace? Pues le dice al compilador que es una función recursiva y que la trate como una función iterativa en lugar de recursiva.
Y esto ¿por qué? vamos a poner un ejemplo del cálculo de un elemento de la sucesión de Fibonacci donde existe un crecimiento alto en cada llamada recursiva. Si eliminamos la palabra clave modificador (aunque es una anotación)
Y esto ¿por qué? vamos a poner un ejemplo del cálculo de un elemento de la sucesión de Fibonacci donde existe un crecimiento alto en cada llamada recursiva. Si eliminamos la palabra clave modificador (aunque es una anotación)
tailrec
para un n = 10000, la función muestra un error StackOverflow
. Al añadirla de nuevo, la función se convierte a nivel compilador en una función iterativa y el error no se produce.
tailrec fun fibonacci(n: Int, a: BigInteger= BigInteger.ZERO, b: BigInteger= BigInteger.ONE): BigInteger { return if (n == 0) b else fibonacci(n - 1, a + b, a) }
val n = 10000
println("fib($n)=${fibonacci(n)}")
Exception in thread "main" java.lang.StackOverflowError
at MainKt.fibonacci(Main.kt:52)
val n = 10000
println("fib($n)=${fibonacci(n)}")
fib(10000)= 20793608237133498072112648988642836825087036094015903119682945866528501423455686648927456034305226515591757343297190158010624794267250973176133810179902738038231789748346235556483191431591924532394420028067810320408724414693462849062668387083308048250920654493340878733226377580847446324873797603734794648258113858631550404081017260381202919943892370942852601647398213554479081823593715429566945149312993664846779090437799284773675379284270660175134664833266377698642012106891355791141872776934080803504956794094648292880566056364718187662668970758537383352677420835574155945658542003634765324541006121012446785689171494803262408602693091211601973938229446636049901531963286159699077880427720289235539329671877182915643419079186525118678856821600897520171070499437657067342400871083908811800976259727431820539554256869460815355918458253398234382360435762759823179896116748424269545924633204614137992850814352018738480923581553988990897151469406131695614497783720743461373756218685106856826090696339815490921253714537241866911604250597353747823733268178182198509240226955826416016690084749816072843582488613184829905383150180047844353751554201573833105521980998123833253261228689824051777846588461079790807828367132384798451794011076569057522158680378961532160858387223882974380483931929541222100800313580688585002598879566463221427820448492565073106595808837401648996423563386109782045634122467872921845606409174360635618216883812562321664442822952537577492715365321134204530686742435454505103269768144370118494906390254934942358904031509877369722437053383165360388595116980245927935225901537634925654872380877183008301074569444002426436414756905094535072804764684492105680024739914490555904391369218696387092918189246157103450387050229300603241611410707453960080170928277951834763216705242485820801423866526633816082921442883095463259080471819329201710147828025221385656340207489796317663278872207607791034431700112753558813478888727503825389066823098683355695718137867882982111710796422706778536913192342733364556727928018953989153106047379741280794091639429908796650294603536651238230626