수색…
소개
OCaml과 같은 함수형 언어는 재귀 함수 에 크게 의존 합니다 . 그러나 이러한 함수는 메모리를 소비하거나 대량의 데이터 집합을 처리 할 때 오버플로 를 스택시킬 수 있습니다.
테일 재귀는 이러한 경우 최적화의 중요한 원천입니다. 재귀 호출이 함수의 마지막 일 때 프로그램은 호출자 컨텍스트를 삭제할 수 있습니다 .
합계 함수
아래는 정수 목록의 합계를 계산하기위한 비 꼬리 재귀 함수입니다.
let rec sum = function
| [] -> 0
| h::t -> h + (sum t)
함수가 수행하는 마지막 작업은 추가 작업입니다. 따라서이 함수는 tail-recursive가 아닙니다.
아래는 동일한 기능의 꼬리 재귀 버전입니다.
let sum l =
let rec aux acc = function
| [] -> acc
| h::t -> aux (acc+h) t
in
aux 0 l
여기서 aux 함수는 tail-recursive입니다. 마지막 작업은 자체 호출입니다. 결과적으로, 후자의 sum 는 임의의 길이의리스트와 함께 사용될 수 있습니다.
Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow