재귀함수 : 자기 자신을 호출하는 함수
재귀함수의 장점
-변수를 여러 개 사용할 필요가 없다
-코드가 간결해진다
재귀함수의 단점
-반복문에 비해 코드 흐름을 직관적으로 파악하기 힘들다
-호출 과정에서 process stack에 메모리를 저장하는데, 반복문에 비해 메모리를 더 많이 사용하게 된다
-메서드 종류 이후 복귀를 위한 컨텍스트 스위칭 비용이 발생한다
재귀함수 만들기
-문제를 작은 단위로 쪼갠다 > recursive case
-종료 조건(base case)이 존재해야 한다
재귀함수가 적합한 경우
-문제를 비슷한 구조의 작은 단위로 나눌 수 있는 경우
-중첩된 반복문이 많을 경우
-반복문의 중첩 횟수(number of loops)를 예측하기 힘들 경우
-변수 사용을 줄여 변경 가능한 상태(mutable state)를 제거하여 오류 가능성을 줄이는 경우
StringTokenizer는 문자열 리턴타입이 보통 String인데
StringBuilder는 Stringbuilder네....
다시 한 번 공식 문서 확인하는 습관들이자.
public static int[] reverseArr(int[] arr){
// TODO:
if (arr.length == 0) return new int[]{};
int head = arr[0];
int[] tail = reverseArr(Arrays.copyOfRange(arr, 1, arr.length));
int[] retArr = new int[arr.length];
System.arraycopy(tail, 0, retArr, 0, arr.length - 1);
retArr[retArr.length - 1] = head;
return retArr;
}
if (arr.length == 0) return new int[]{};
if (arr.length == 1) return arr;
int[] retArr = new int[arr.length];
retArr[0] = arr[arr.length - 1];
retArr[retArr.length - 1] = arr[0];
int[] midArr = reverseArr(Arrays.copyOfRange(arr, 1, arr.length - 1));
System.arraycopy(midArr, 0, retArr, 1, midArr.length);
return retArr;
난 뒤집는 건 맨 앞, 맨 끝 서로 위치 바꾸는 걸 한 세트로하는 걸로 하는 것만 해서 후자로 풀었다가 호출횟수 부족하다고 다시 해오라고 했다
FILO하는 스택의 특성을 살려서 앞에거 차곡차곡 쌓아놓고 하나씩 꺼내도 뒤집히긴하지
풀이방법 하나에 너무 매몰되지 말자
대부분의 기술, 엔지니어링에 완벽한 건 없다. 하나 배우면 그것의 장단점을 파악해놓자!!!
구현도 많이 해보면 좋다!!
나중에 읽을 책들
-자바 모던 인 액션
-스프링 입문을 위한 자바 객체 지향의 원리와 이해
-헤드 퍼스트 디자인 패턴