algorithm/정리

재귀

ssoheeh 2024. 4. 11. 16:33

재귀

하나의 함수에서 자기 자신을 다시 호출해 작업을 수행하는 알고리즘

 

재귀 함수의 조건

특정 입력에 대해서는 자기 자신을 호출하지 않고 종료되어야 함 (Base condition)

모든 입력은 base condition으로 수렴해야 함

 

 

재귀에서는 함수를 명확하게 정의해야한다!

- 함수의 인자로 어떤 것을 받을지

- 어디까지 계산한 후 자기 자신에게 넘겨줄지

 

 

모든 재귀 함수는 반복문만으로 동일한 동작하는 함수 만들 수 있음

재귀는 반복문 구현보다 코드가 간결하지만 메모리/시간에서는 손해 -> 적절한 때에 재귀 구현

한 함수가 자기 자신을 여러 번 호출 -> 매우 비효율적!!

 

 

재귀함수가 자기 자신을 부를 때 스택 영역에 계속 누적이 됨 -> 스택 제한이 있는 경우 메모리 초과 날 수 있음

 

 

백준 11729번 (하노이 탑 이동 순서)

import java.awt.*;
import java.util.*;
import java.io.*;


public class Main {

    static StringBuilder sb = new StringBuilder();
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        sb.append((int)(Math.pow(2, N))-1).append("\n");
        //System.out.println((int)(Math.pow(2, N))-1);
        func(1, 3, N);

        System.out.print(sb);
    }

    private static void func(int start, int end, int n) {
        if(n==1){
            sb.append(start).append(" ").append(end).append("\n");
            //System.out.println(start+" "+end);
            //System.out.println(sb);
            return;
        }
        func(start, 6-start-end, n-1);
        sb.append(start).append(" ").append(end).append("\n");
        func(6-start-end, end, n-1);
    }


}

 

 

'algorithm > 정리' 카테고리의 다른 글

DFS  (0) 2024.04.16
알고리즘 - 기초 코드 작성 요령  (0) 2024.04.14
BFS  (0) 2024.04.10
자바 기본 자료구조 선언 정리  (0) 2024.04.09
그리디 알고리즘  (0) 2024.04.09