소통
전역변수를 이용하면 함수들 간에 정보를 교환할 수 있다.
하지만... 전역변수와 지역변수의 이름이 같을 때는 전역변수에 접근할 수 없고, 어떤 함수가 전역변수에 접근했는지 판단하기 어렵기 때문에 디버깅도 어렵다.
그러므로 두 함수 사이에서 소통하는 방법이 합리적이다.
지역 변수를 복사해서 건네주고, 또 리턴 값을 돌려받는 방식으로 함수들 간의 소통을 구현할 수 있다.
이 때 리턴할 수 있는 인자는 하나뿐이기에 이 부분에 주의해서 코드를 작성하자.
재귀
알고리즘 문제를 풀 때 분할 정복 방법으로 푸는 경우가 많다.
이 때 자신을 호출하는 재귀함수를 많이 사용한다.
속도와 성능 측면에서는 불리하지만, 코드를 간결하게 작성할 수 있을 경우 사용한다.
재귀함수는 base case부분과 재귀 호출 부분으로 구성된다.
대표적인 예시인 피보나치를 살펴보면..
int fibo(int n){
if(n == 1){
return 0;
}
if(n == 2){
return 1;
}
return fibo(n-1) + fibo(n-2);
}
base case와 재귀호출 부분으로 나뉘어진 것을 확인할 수 있다.
재귀호출을 과하게 하면 스택 프레임이 초과돼 스택오버플로우 오류가 발생할 수 있으니 조심하자.
재귀로 표현하는 경우는 반복문으로도 표현할 수 있다.
가능하긴 하지만.. 매우 힘들어지는 케이스도 있지만 일단은 가능하다. (ex. 트리의 반복문 구현)
일을 먼저 하고 재귀 호출을 수행하는 재귀를 꼬리 재귀라고 하고,
재귀 호출을 하고 돌아오면서 일을 하는 재귀를 머리 재귀라고 한다.
꼬리 재귀가 머리 재귀보다 좀 더 빠르다.