oCaml이이 코드를 꼬리 재귀 적으로 최적화하는지 궁금하고 F #도 그렇습니까?이 함수는 꼬리 재귀를 사용합니까?
let rec sum xs =
match xs with
| [] -> 0
| x :: xs' -> x + sum xs'
oCaml이이 코드를 꼬리 재귀 적으로 최적화하는지 궁금하고 F #도 그렇습니까?이 함수는 꼬리 재귀를 사용합니까?
let rec sum xs =
match xs with
| [] -> 0
| x :: xs' -> x + sum xs'
재귀 적 경우 (즉, xs가 비어 있지 않은 경우) 마지막으로 평가 된 연산이 덧셈이다. 함수가 tail-recursive가 되려면 마지막 평가 된 연산이 sum에 대한 재귀 호출이어야합니다.
일반적으로 이와 같은 함수는 꼬리 재귀 적으로 만들기 위해 누산기가있는 도우미 함수를 사용하여 정의됩니다. 이 경우 합계가되는 목록과 합계의 현재 값을 취하는 함수가됩니다. 리스트가 하늘의 경우, 합계의 현재의 값을 돌려줍니다. 목록이 비어 있지 않으면 목록의 꼬리와 합계의 현재 값 + 목록의 머리글을 인수로 호출합니다. 그런 다음 sum 함수는 단순히 목록과 함께 헬퍼 함수를 호출하고 합계의 현재 값으로 0을 호출합니다.
아니요,이 코드는 꼬리 재귀가 아니며 ocaml은 변환하지 않습니다. 너 혼자해야 해.
F #에 대해서는 잘 모릅니다. 그러나이 문제를 최적화 할 수 있을지는 의문입니다.
그래, oCaml이 최적화하기가 힘들지 않습니다. 그냥 currentVal param을 추가하고 sum xs ', currentSum을 호출하면됩니다. 이 간단한 것을 알면 최적화가되는지 알기를 원합니다. 그래서 당신은 말하지 않습니다. 흠 .. 나는이 기계에 oCaml 쓰레기통을 가지고 있지 않아서 나는 검사를 할 수없고 그것이 왜 또는 wouldnt인지를 안다. –
@ acidzombie24이 경우 최적화 할 수 있지만 컴파일러가 변환을 수행 할 수없는 약간 더 복잡한 경우 스택 오버플로가 발생합니다. 예를 들어, 다른 모듈의 순수한 함수를 사용하여 동일한 변환을 기대할 수 있으며, 예상 할 수는 있지만 별도의 컴파일로 인해 컴파일러가 변환을 수행 할 수 없으며 인터페이스가 함수가 순수한. –