
💡 재귀함수를 공부하기 전, 함수에 대해 복습하고 넘어가자

반환타입 함수명(매개변수){
return `반화타입과 같은 데이터`;
}
혹은
반환타입 함수명(입력){
return 출력;
}
로 보면 편하다.
ex. 숫자를 문자로 변환하는 함수
public static String numberToString(int a){
return "[숫자] : " + a;
}
//////////////////////////////////////////////////////////////
// 오버로딩에 대한 것 : calc라는 같은 이름을 써도!
// 매개변수의 갯수나 타입에 따라 자동으로 매칭된다.
public static int calc(int a,int b){
return a*b;
}
public static int calc(int a, int b,int c){
return a*b+c;
}
public static int calc(int a, int b,double c){
int ret = (int)(c * 10);
return (a*b)+ret;
int factorial(int n) {
if (n === 1) {
return 1;
}
return n * factorial(n-1);
}
public static int fibonacci(int index) {//5
if (index == 1) {
return 1;
}
if (index == 2) {
return 1;
}
int value = fibonacci(index - 1) + fibonacci(index - 2);
//fibonacci(2)+fibonacci(1) + fibonacci(2) + fibonacci(2)+fibonacci(1)
return value;
}
변수를 여럿 만들 필요가 없다.
ex. 현재 상태를 저장해야 할 경우 tmp 변수를 만들기보다 상태를 메서드를 재귀적으로 호출하면서 변경된 상태를 전달 함으로써 변수의 수를 줄일 수 있다.
while문이나 for문같은 반복문을 사용하지 않아도 되기에 코드가 간결해진다.
지속적으로 함수를 호출하게 되면서 지역변수, 매개변수, 반환값을 모두 process stack에 저장해야한다. 그리고 이런 과정은 선언한 변수의 값만 사용하는 반복문에 비해서 메모리를 더 많이 사용하게 되고, 이는 속도 저하로 이어진다.
함수 호출 → 복귀를 위한 컨텍스트 스위칭에 비용이 발생하게 된다.