2012-10-15 4 views
4

꼬리 재귀 함수를 반복 알고리즘보다 선호해야하는 이유를 설명하는 기사를 찾을 수 없습니다.꼬리 재귀 대 반복 알고리즘

필자는 왜 꼬리 재귀가 모든 곳에서 명확하게 설명되는 단순한 재귀보다 나은지 묻지 않습니다.

그래서

sum(n) = { 
    def sumImpl(n, acc) = if(n <= 0) acc else sumImpl(n - 1 , n + accumulator) 
    sumImpl(n, 0) 
} 

는 재귀가 프로그램을 더 쉽게 읽을

sum = 0; 
while(n--) sum += n 
+0

코드가 맞습니까? 나에게'sum (n)'은 항상 0을 반환하는 것처럼 보입니다. – phant0m

+0

맞습니다. 나는 좋은 버전으로 업데이트했다 : D – raisercostin

답변

5

하는 것이 바람직하다 왜, 그러나 빈약 한 성능을 제공합니다. 반복적 인 절차는 좋은 성능을 제공하지만 읽을 수있는 것은 아니며 중간 값 (가변성)을 저장하기 위해 로컬 변수가 필요할 수 있습니다. 꼬리 재귀를 사용하면 두 세계의 장점을 얻을 수 있으며 "합"변수가 필요하지 않습니다 (불변성). 이것은 결과를 다음 재귀 함수 호출로 전달할 때 stackoverflow 예외를 얻지 못하기 때문에 큰 합계 또는 계승을 계산할 때 매우 유용합니다.

병렬 환경에서 불변성은 매우 중요합니다. 코드를 편집하고 매우 큰 숫자를 함수에 전달하여 차이점을 확인하십시오.

추가 읽기 here

+0

이전의 경우 기능적인 접근은 더 읽기 쉽지 않다. 그래도 그 버전을 선택해야합니까? – raisercostin

+0

당신의 예는 사소한 것입니다. 이 경우 반복은 명백한 선택입니다. 반복, 재귀, 꼬리 재귀 호출 간의 차이점을 확인하려면이 시도하십시오. http://ideone.com/i0md7 – sgud

+0

꼬리 반복적 인 것이 재귀 적 (피보나치의 경우 6 배)보다 효율적일 수 있다고 말하는 것입니까? fibonacciIt - 위치 : 10000 시간 : 137275432 ns fibonacciTail- 위치 : 10000 시간 : 20357861 ns 직접 확인합니다. D. 감사 – raisercostin