여기서 우리는 꼬리 재귀가 무엇인지 볼 것입니다. 꼬리 재귀는 기본적으로 재귀 함수를 함수의 마지막 문으로 사용합니다. 따라서 재귀 호출에서 돌아온 후 할 일이 없을 때를 꼬리 재귀라고 합니다. 꼬리 재귀의 한 예를 볼 것입니다.
예시
#include <iostream> using namespace std; void printN(int n){ if(n < 0){ return; } cout << n << " "; printN(n - 1); } int main() { printN(10); }
출력
10 9 8 7 6 5 4 3 2 1 0
꼬리 재귀는 꼬리 재귀가 아닌 것보다 낫습니다. 재귀 호출 후에 남은 작업이 없으므로 컴파일러가 코드를 최적화하기가 더 쉽습니다. 하나의 함수가 호출되면 해당 주소는 스택 내부에 저장됩니다. 따라서 꼬리 재귀라면 스택에 주소를 저장할 필요가 없습니다.
재귀를 사용하여 계승을 사용할 수 있지만 함수는 꼬리 재귀가 아닙니다. 팩트(n-1)의 값은 팩트(n) 내부에 사용됩니다.
long fact(int n){ if(n <= 1) return 1; n * fact(n-1); }
다른 매개변수를 추가하여 꼬리 재귀로 만들 수 있습니다. 이것은 아래와 같습니다 -
long fact(long n, long a){ if(n == 0) return a; return fact(n-1, a*n); }