1. 재귀란?
함수가 자기 자신을 호출하여 문제를 해결하는 프로그래밍 기법이다.
재귀 참고 링크 :
https://coding-ok.tistory.com/7?category=1011888
[자료구조] 재귀(순환)함수 recursion
1. 재귀(순환)이란? - 알고리즘이나 함수가 수행 도중 자기 자신을 호출하여 문제를 해결하는 기법이다. - 재귀 함수는 호출 직전의 매개 변수, local data, return address 등을 stack에 저장한다. - 재귀
coding-ok.tistory.com
2. 하노이 탑
하노이 탑은 크기가 다른 3개의 원판을 옮기는 문제이다.
원판이 n개 있다고 한다면 이를 재귀로 해결할 수 있다.
먼저 n개의 원판을 생각하지 말고 2개의 원판만 있다고 생각해보자.
2개의 원판이 A(출발지)에 있다고 생각하고
위의 원판을 B(중간 기둥)에 옮기고
아래 원판을 C(목적지)에 옮기고
B(중간 기둥)에 있던 원판을 C(목적지)위에 올리면 모두 이동할 수 있다.
n개의 원판이 있다고 생각해본다면
n개의 원판이 A에 쌓여있을 때,
가장 먼저 위에 있는 n-1개의 원판을 B로 옮긴 후
남아있는 1개의 원판을 C로 옮긴다.
그리고 B에 있는 n-1개의 원판을 C 위에 올린다.
//from 기둥에 있는 n개의 원판을 to 기둥으로 옮긴다.
//즉 from은 출발지, temp는 (목적지가 아닌) 중간 기둥, to는 최종적으로 원판을 놓고 싶은 기둥이다.
void hanoi(int n, char from, char temp, char to){
if(n == 1){
//from에 있는 1개의 원판을 to로 옮긴다.
printf("원판 1개를 %c에서 %c로 옮긴다.", from, to);
}else{
//from의 맨 밑의 원판을 제외한 나머지 원판들을 temp로 옮긴다.
hanoi(n-1, from, to, temp);
//from에 있는 한개의 원판을 to로 옮긴다.
printf("%d를 %c에서 %c로 옮긴다.", n-1, from, to);
//temp의 원판들을 to로 옮긴다.
hanoi(n-1, temp, from, to);
}
}
int main(int argc, const char * argv[]) {
hanoi(3, 'A', 'B', 'C');
}
'CS > 자료구조' 카테고리의 다른 글
[자료구조] 연결리스트로 구현한 스택(stack) (0) | 2022.06.13 |
---|---|
[자료구조] 원형 연결리스트(Circular LinkedList) (0) | 2022.06.09 |
[자료구조] 연결리스트(Linked List) (0) | 2022.06.09 |
[자료구조] 시간복잡도, 빅오표기법 (0) | 2022.04.26 |
[자료구조] 재귀(순환)함수 recursion (0) | 2022.04.15 |