개발자 미니민의 개발스터디

[JAVA] 자바 - 재귀 호출

by mini_min
[JAVA]
자바 - 재귀호출

 

오늘 중요한걸 대체 몇 개를 배웠는지... 클래스로 넘어가면서부터 자바라는 언어를 온전히 받아들이는 과정을 겪는중... 물론 매우 힘들다... 거의 태어나서 처음으로 프로그래밍적인 내용을 배우는 거니까...! 아무튼, 즐.겁.다.

 

✔️ 재귀호출 이란?

메소드 내에서 메소드 자기 자신을 호출하는 방식!!

영어에 재귀대명사와 같다고 볼 수 있다~

 

◾ 특징

코드 간결! 오류 수정 용이!

하지만 실행 시간 관점에서 처리 속도가 느려 반복문보다 비효율적이다. 하나 이상의 종료 조건을 두고 꼭! 종료 해야한다.

= 만약 무한반복된다면....  재귀호출은 Stack 영역 사용하기 때문에 java.lang.StackOverflowError 에러 발생하니 주의 ㅠㅠ

 

◾ 재귀호출 이용한 예시

- 계승 구하기, 하노이 탑, 퀵 정렬, 병합 정렬, 파일 찾기 등...

(개발자 동생이 중요하다고 했음...)

 

 

 

✔️ 재귀호출로 합 구하기

public int sum(int n) {
return n > 1 ? n+sum(n-1) : n;
//스스로 출력 .....쭉..
}

// n + 재귀 (n-1 + 재귀 (n-2 + 재귀 (n-3 + 재귀 .... 0이 될 때 까지 재귀호출하여 합을 구할 수 있다.

 

 

 

✔️ x의 y승 구하기

개인적으로 조금 이해가 안 갔던 문제 . 어떻게 풀어야하나 감이 오지 않았는데, 위에 재귀호출로 합을 구한 것처럼 삼항 연산자를 이용하면 '어떻게 풀어야할지' 가 보이더라! 삼항 연산자는 익숙하지 않아서 생각해내기 조금 어려웠다.

if (y>=0) {
return y==0 ? 1: x* pow(x, y-1);
else
return (1.0 / x) * pow(x,y+1);

// y가 반복 횟수가 되어준다고 생각하면 편하더라. else 는 x의 -y 승을 구하기 위해서 쓰는데 이번에 배워간다... 수업 시간에 -y승에 대한 지식이 없어서 잘 풀지 못함... 이제 알았으니 됐따!!

 

 

 

✔️ 피보나치 수열

클래스고 메소드고 재귀고 아무것도 모를 때 엄청 고생해서 for 문장으로 풀었는데 '피보나치 수열' 은 재귀호출 쓰니까 순식간에 풀 수 있더라.

public static int fibo (int n) {
if(n < 2) {
return n;
}
else if {
return fibo(n-1) + fibo(n-2);
// 0 1 1 2 3 5 ...
}
}

// 바로 뒤에 두 수를 더해서 만들어지는 피보나치 수열의 원리를 재귀호출로 구현

 

 

 

✔️ 최대공약수 구하기

이번에도 재귀호출 이용하기. 삼항 연산자 이용

public static int gcd(int a, int b) {
return b==0 ? a : gcd(b, a%b);
}

💡 나머지로 최대공약수 구하는 공식!!!!

a = n1;
b = n2;
int mod = a % b;
while (mod > 0) {
a = b;
b = mod;
mod = a % b;
}

 

 

 

✔️ 트리구조 재귀호출 이해하기...⭐⭐⭐

Test9 t = new Test9();
t.print(3);
////////////////////////////
class Test9 {
public void print(int n) {
System.out.println("start : " + n);
if(n>1) {
print(n-1);
print(n-1);
}
System.out.println("end : " +n);

// 수업 시간에 잠깐 하고 지나갔는데 응? 싶었던 내용이다. 결과는 아래와 같이 나온다.

 

 

 

 

// start 3 찍고 => n-1 재귀로 돌아감 (n-1 킵)

// start 2 찍고 => 다시 n-1 재귀로 돌아감 (이때, n-1 하나 킵) 

// star 1 찍고 if 거짓, 종료 end 1 찍음

// 2에서 n-1 킵한 것 시작 start 1 + if 거짓으로  end 1

// start 2 드디어 종료 end 2

 

// 다시 start 3에서 남은 (n-1) 시작

// start 2 찍고 => 다시 n-1 재귀로 돌아감 (이때, n-1 하나 킵)

// start 1 찍고 if 거짓, 종료 end 1 찍음

// 2에서 n-1 킵한 것 시작 start 1 + if 거짓으로 end 1

// start 2 드디어 종료 end 2

// 마지막으로 start 3의 종료 찍음 end 3

 

 

느낀점 : 재귀는 정말 뱅글뱅글 모두 호출하여 도는구나......!

 

 

 

 

블로그의 프로필 사진

블로그의 정보

개발자 미니민의 개발로그

mini_min

활동하기