Mentre giocando con un esempio di ricorsione in coda ho notato una piccola discrepanza tra i risultati di una normale chiamata ricorsiva e una coda chiamata ricorsiva:Perché c'è una differenza di arrotondamento tra la mia ricorsione normale e l'esempio di ricorsione della coda?
scala> def fact(n: Int): Double = if(n < 1) 1 else n * fact(n - 1)
fact: (n: Int)Double
scala> fact(30)
res31: Double = 2.6525285981219103E32
scala> @tailrec def fact(n: Int, acc: Double = 1): Double = if(n < 1) acc else fact(n - 1, n * acc)
fact: (n: Int, acc: Double)Double
scala> fact(30)
res32: Double = 2.652528598121911E32
Solo per curiosità, qualcuno può spiegarmi perché o dove la l'arrotondamento sta accadendo. La mia ipotesi è che, poiché il compilatore Scala traduce la versione ricorsiva della coda in un ciclo, il parametro acc
viene assegnato ad ogni iterazione del ciclo e che l'errore di arrotondamento piccolo si inserisce al suo interno.
In un linguaggio di programmazione corretto, come Scala, l'assegnazione di un risultato 'Double' a una variabile' Double' non introduce un errore di arrotondamento. –