꼬리 함수(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을 제공하지 않는다.)
'알고리즘(アルゴリズム) > 알고리즘 이모저모(アルゴリズムの緒論)' 카테고리의 다른 글
고정된 데이터들의 탐색 vs 회전하는 데이터들의 탐색 (2) | 2023.01.26 |
---|---|
재귀 함수(recursive function)에 대한 메뉴얼 (0) | 2023.01.26 |
[Hash Table vs Hash Map vs 배열] vs Linked List (2) | 2023.01.26 |
conanical coin system (0) | 2023.01.04 |
long vs int (0) | 2022.12.27 |