반복과 재귀는 유사한 작업 수행 가능
반복
은 수행하는 작업이 완료될 때까지 반복(for, while)재귀
은 주어진 문제의 해를 구하기 위해 동일하면서 더 작은 문제의 해를 이용하는 방법(분할 정복)재귀 함수(Recursive Function)
기본 부분(Basis Part)
, 유도 부분(Inductive Part)
로 구성재귀와 반복
재귀 | 반복 | |
---|---|---|
종료 | 재귀 함수 호출이 종료되는 베이스 케이스 | 반복문의 종료 조건 |
수행 시간 | (상대적)느림 | 빠름 |
메모리 공간 | (상대적)많이 사용 | 적게 사용 |
소스 코드 길이 | 짧고 간결 | 길다 |
소스 코드 형태 | 선택 구조(if..else) | 반복 구조(for, while) |
무한 반복시 | 스택 오버플로우 | CPU 반복해서 점유 |
// 반복
int n = 10;
int f0 = 0;
int f1 = 1;
int fn = 0;
for(int i = 2; i <= 10; i++){
fn = f0 + f1;
f0 = f1;
f1 = fn;
}
fibo(n){
if (n < 2) return n; // 기본 부분(기저 조건)
else return fibo(n-1) + fibo(n-2); // 유도 부분
}
메모이제이션(memoization) : 컴퓨터 프로그램을 실행할 때 이전에 계산한 값을 메모리에 저장하여 매번 다시 계산하지 않도록 하여 전체적인 실행 속도를 빠르게 하는 기술. 동적 계획법의 핵심.
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int num; //원판 갯수
num=scanner.nextInt();
hanoi('A','B','C',num);
}
static int count = 0;
public static void hanoi(char from,char temp,char to,int num){//from -> to 로 원판num이 이동
if(num==0)
return;
hanoi(from,to,temp,num-1);
System.out.printf("%d. %c에서 원판%d을(를) %c로 이동\n",++count,from, num, to);
hanoi(temp,from,to,num-1);
}