雖然有尾遞歸例子玩弄我注意到一個正常的遞歸調用的結果和尾遞歸調用之間存在細微的差異:爲什麼我的正常遞歸和尾遞歸示例之間存在舍入差異?
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
只是出於好奇,有人可以給我解釋爲什麼或當四捨五入正在發生。我的猜測是,由於Scala編譯器將尾遞歸版本轉換爲循環,因此acc
參數在循環的每次迭代中都被分配,並且小的舍入錯誤會在那裏出現。
在一個適當的編程語言,比如Scala是,分配一個'Double'結果到一個'Double'變量不引入的舍入誤差。 – 2012-08-06 13:53:19