얕은 분석 끝에 귀속되다

1265 단어 귀속

일부 함수식 언어를 배울 때, 자주 꼬리 귀속을 만난다.총결산하다
 
무엇이 미귀착입니까
 
귀속은 함수가 그 자체를 직접 또는 간접적으로 호출하는 것을 가리킨다.귀환은 어떤 문제를 일으킬까요? 매번 함수가 호출될 때마다 관련 정보를 저장하는 방법 창고가 필요합니다.귀속 깊이가 너무 깊으면 창고가 넘칠 수밖에 없다.예를 들면, 피보나치 함수.
 
 
public int fib(int n)
{
	if(n<2){
		return n;
	}
	return fib(n-1)+fib(n-2);
}
 
 
위의 코드는 전통적인 귀속이다.n이 너무 크면 창고가 넘칠 수 있습니다
 
꼬리 귀속으로 실현:
 
public int fib(int n,int acc1,int acc2)
{
	if(n==0)
		return acc1;
	return fib(n-1,acc2,acc1+acc2);
}
 
 
미귀환의 본질은 단일 계산 결과를 캐시하여 다음 호출에 전달하는 것으로 자동 누적에 해당한다.
 
후귀적 용도
 
자바와 같은 명령식 언어에서 꼬리 귀속 사용은 매우 드물다. 왜냐하면 우리는 직접 순환으로 해결할 수 있기 때문이다.함수식 언어에서 꼬리귀속은 일종의 신기로서 순환을 실현하려면 그것에 의지해야 한다.
 
미귀속의 최적화
 
많은 사람들이 의문을 가질 수 있는데 왜 꼬리 귀환도 귀환인데 창고가 넘치지 않는가?컴파일러는 보통 꼬리 귀속을 최적화하기 때문이다.컴파일러는 창고 정보를 저장할 필요가 없다는 것을 발견하고 함수 끝에서 관련 창고를 직접 비운다.
 
 
추가 정보 시작 내 공간
 
참고 자료
 
1.http://en.wikipedia.org/wiki/Tail_call
2.http://www.cnblogs.com/JeffreyZhao/archive/2009/04/01/tail-recursion-explanation.html

좋은 웹페이지 즐겨찾기