알고리즘 공부

2. Recursion(1)

늦깍이 2022. 9. 15. 13:59
인프런의 '영리한 프로그래밍을 위한 알고리즘 강좌' 내용 정리입니다.

        Recursion이란?

  • 자기 자신을 호출하는 함수 ( 재귀 함수 )
pubilc class Code01 {
	public static void main(String [] args) {
    	func();
    }
    
    public static void func() {
    	System.out.println("Hello...");
        func();// 재귀 함수
    }
}
  • 무한 루프에 빠지지 않는 재귀 함수
    적어도 하나의 recursion에 빠지지 않는 경우를 만들면 된다.
pubilc class Code01 {
	public static void main(String [] args) {
    	int n = 4;
    	func(n);
    }
    
    public static void func(int k) {
    	if (k <= 0) return; // 무한 루프 방지
        else{
	    System.out.println("Hello...");
    	    func(k-1);// 재귀 함수
        }
    }
}
  • 다양한 예를 구현할 수 있다.
    n부터 1 까지의 합 : n + func(n-1)
    n! : n * func(n-1)
    xⁿ : x * power(n-1)
    피보나치 : fibonacci(n-1) + fibonacci(n-2)
    최대 공약수 (유클리드 메서드) : if(q == 0) return p; else gcd(q, p%q);
  • 수학적 귀납법을 통해 증명하는게 좋다.

  • 문자열의 길이 계산
public static int length(String str) {
    if(str.equals(""))
        return 0;
    else
        return 1 + length(str.substring(1));
}
  • 문자열의 프린트
public static void printChars(String str) {
    if(str.length()==0)
        return;
    else{
        System.out.print(str.charAt(0));
        printChars(str.subString(1));
    }
}
  • 문자열 뒤집어 프린트
public static void printCharsReverse(String str) {
    if ( str.length() == 0 )
        return;
    else {
        printCharsReverse(str.substring(1));
        System.out.print(str.charAt(0));
    }
}
  • 2진수로 변환하여 출력
public void printInBinary(int n) {
    if (n < 2)
        System.out.print(n);
    else{
        printInBinary(n/2);
        System.out.print(n%2);
    }
}
  • 배열의 합 구하기
public static int sum(int n , int [] data){
    if(n<=0)
        return 0;
    else
        return sum(n-1, data) + data[n-1];
}

        Recursion vs Iteration

  • 모든 순환 함수는 반복문(iteration)으로 변경 가능하다.
  • 그 역도 성립한다.
  • 복잡한 알고리즘을 단순하게 만들어줌
  • 함수 호출에 따른 오버헤드를 주의할 것.