본문 바로가기

알고리즘(アルゴリズム)/알고리즘 이모저모(アルゴリズムの緒論)

재귀 함수(recursive function) with 꼬리 재귀(tail recursive)

꼬리 함수(tail call)

int calculate(int[] data, int multiplier)
{

	int [] tempData = new int[data.length]
    
    for(i=0;i.data.length;)i++{
    
    tenodata[i] = data[i] * multiplier;
    
    }

	return accumlatie(tempdata); // 꼬리 호출

}

 

calculate() 실행 중, accumulate(tempdata)가 실행되게 된다. 

이 시점에서, caculate() 함수에 대한 stack frame과 더불어 accumulate(tempdata)에 대한 stack frame이 새로 생성이 된다.

 

Q. 위 코드를 봤을 때, caculate() 함수에 대한 stack frame을 만드는 것이 과연 실익이 있는 것일까??

A. 없다

-> Stack Frame의 존재 이유는 함수 실행 중 변수값을 유지하면 함수로 다시 복귀했을 때 남은 명령어를 실행시키기 위해서 필요한 것인데,

위 코드를 보면 accumulate()가 실행 종료가 되어도, calculate() 함수는 더 이상 실행할 명령어(instruction)이 없다. 

고로,  calculate() 함수에 대한 Stack Frame을 굳이 만들 필요가 없었던 것이다.  

( 컴파일러에 따라서는 이러한 꼬리 함수(tail call)이 있을 때, 그 꼬리 함수를 호출한 함수에 대해서는 stack frame을 만들지 않는 tail call optimization을 제공한다. 참고로, JAVA에서는 tail call optimization을 제공하지 않는다.)