함수를 설명하기 전 컴퓨터의 메모리 구조에 대해 간략하게 살펴보자
메모리는 다음과 같은 구조로 되어있다.

여기서 메모리는 컴퓨터의 주기억장치에 해당이 된다.
cpu에 작업처리명령(프로그램 실행)을 하게 되면 프로세스의 작업 우선순위에 따라 프로그램이 실행이 되고 주기억장치에 위 그림처럼 각각의 영역에 할당된다. 코드가 컴파일러에 의해 컴파일 되면서 코드에 따라 각 영역에 할당된다. 이 때 스택은 cpu의 스택 포인터 레지스터에 의해 주소가 참조되어 처리된다.
실행되는 함수는 스택영역에서 동작하게 된다.
다음 코드가 실행됨에 따른 스택영역의 동작을 그림으로 추상하면 다음과 같다.
int Add(int num1, int num2){
return num1 + num2;
}
int main(){
print("%d", Add(2,3))
return 0;
}


함수 사용 시 함수 내부에서 사용되는 변수들은 지역변수로써 만약 변수를 찾지 못하면 전역변수나 정적변수에서 찾아서 사용하고 그래도 없으면 컴파일 오류를 리턴한다.
재귀 함수는 자기 자신을 호출하는 함수로 그림으로 추상화 하면 다음과 같다.
int Factorial_Re(int num) {
if (num == 1) {
return 1;
}
return num * Factorial_Re(num - 1);
}
int main() {
int result = Factorial_Re(4)
printf("재귀함수 팩토리얼 결과 : %d\n", result);
return 0;
}


함수호출이 끝나면 스택영역에서 해제되고 main 함수에서 선언한 result에 그 결과가 저장된다.
main함수도 프로그램이 종료되면 스택영역에서 해제된다.
재귀함수를 사용하는 이유는 가독성과 구현이 용이하다는 장점이 있으나 자칫 잘못 구현을 하게된다면 스택오버플로우 문제나 성능에 문제가 생길 수가 있으니 사용 시 충분한 고려를 하여야 한다.
위 팩토리얼 함수는 int형의 특징을 잘 볼 수 있다.
int형은 4byte로써 32bit를 가지며 2진수를 10진수로 표현 가능한 수는 unsigned의 경우 4,294,967,296 수를 표현할 수 있다.
따라서 팩토리얼 13은 6,227,020,800로 32bit로 표현 할 수 있는 수를 넘어버려서 표현하지 못하게 된다. 따라서 팩토리얼 12인 479,001,600까지 표현 할 수 있다.
만약 더 큰 수를 표현 하고 싶다면 long long 타입으로 8byte 64bit가 필요하다.