꼬리 재귀 외에 꼬리 호출 최적화가 있습니까? 나는 재귀와 관련이 없지만 성공하지 못한 것을 찾거나 생각하려고 노력해 왔습니다. 가능한가? 어떤예요?꼬리 재귀 외에 꼬리 호출 최적화?
답변
int bar(int x);
int foo(int x) { return bar(x); }
foo
단순히 직접 호출자에게 반환
bar
로 이동할 수 있습니다
; 아무 재귀도 필요하지 않습니다.
확실히, "꼬리 호출 최적화"는 실제로 가장 일반적인 재귀 적 독립 양식에서 이러한 종류의 최적화라는 용어입니다. 이 최적화는 재귀를 while
루프 또는 이와 유사한 것으로 대체하지 않습니다. 대신 꼬리 호출은 호출자의 스택 프레임이 다시 사용되도록 변형됩니다. return f(...)
또는 f(...); return
형식의 코드는 수정할 수 있습니다. 컴파일러가 무엇이 호출되는지를 알 수없는 함수 포인터/클로저/가상 메소드의 경우에도 에 대해f
에 대해 작동합니다. 따라서 별도의 컴파일, 고차 함수, 후기 바인딩 등을 사용하면 더 효과적입니다.
코드를 충분히 살펴보고 기능적 또는 필수적이라면 아무 것도 따르지 않는 경우가 있습니다. 일반적인 경우는 호출자가 주 작업에 대한 호출 수신자를 위임하고 몇 가지 추가 준비 만 수행하는 경우입니다. 함수 코드에서, 당신은 종종 하나의 일을 수행하고 다른 작은 함수의 관점에서 구현되는 많은 작은 함수를 발견 할 것입니다. 그래서 여러분은 인수에 간단한 변환을 적용한 다음 몇 가지 레이어를 사용하여 다음 계층 (변환 된 데이터를 인수로 사용). TCO는 두 번째 단계를 최적화합니다. (이상적으로) 단순한 jump
처럼 저렴하게 호출 할 수 있으며 모 놀리 식 구현보다 작은 스택 공간을 사용할 수 있습니다. 객체 지향 설계에서 다른 객체의 객체를 작성하고 편리한 방법을 그 대리자를 노출 할 수 있습니다
SomeClass doSomething(Argument a) {
log.debug("Doing something");
return this.somethingDoer.doIt(a, this.someExtraData);
}
수십 (기술적으로 상호 재귀하지만 보통 특정 기능의 거의 활성화를 가지고 또 다른 예 또는 사이에 다른 활성화), 백 상태에 따라 기능을 가지며, 그 입력 상태를 호출함으로써 구현되는 상태 머신이다 :
void stateA() {
// do actual work
// determine which transition applies
stateB();
}
void stateB() {
// do actual work
// determine which transition applies
state...();
}
// dozens, possibly hundreds of other states
[Continuations를 (http://en.wikipedia.org/wiki/Continuation은 -passing_style "Wikipedia article for 'Continuation-passing style')은 꼬리 호출 최적화에 적합합니다. – stakx