연속을 늘리지 않는 재귀

이름 있는 let이나 상호 재귀 프로시저로 루프를 표현하고 재귀 호출을 문서화된 꼬리 위치에 둡니다.

한눈에 보기

LISPEX
(let loop ((xs (list 1 2 3 4)) (sum 0)) (if (null? xs) sum (loop (cdr xs) (+ sum (car xs)))))

결과

OUTPUT
10

작업 방법

  • 재귀 반환 뒤 작업을 결합하지 말고 누산기를 매개변수로 전달합니다.
  • 마지막 if, begin, and·or, cond, case, do, call-with-values, apply 경로에서도 꼬리 위치가 보존됩니다.
  • 테스트에서는 입력을 제한하고 연속 깊이와 실행 비용을 구분합니다.

경계

  • 꼬리 안전성은 무한 루프를 종료시키거나 자원 예산을 없애지 않습니다.