꼬리 재귀 예를 놀겠다는 거 동안 나는 정상적인 재귀 호출의 결과와 꼬리 재귀 호출 사이의 작은 차이가 발견 :정상적인 재귀 및 꼬리 재귀 예제간에 반올림 차이가있는 이유는 무엇입니까?
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
그냥 호기심, 누군가가 나에게 설명해 할 수 있습니다 이유 또는 어디 반올림이 발생합니다. 내 생각 엔 스칼라 컴파일러는 꼬리 재귀 버전을 루프로 변환하기 때문에 루프의 반복마다 acc
매개 변수가 할당되고 작은 반올림 오류가 발생합니다.
스칼라와 같은 적절한 프로그래밍 언어에서 'Double'변수에 'Double'결과를 할당해도 반올림 오류가 발생하지 않습니다. –