하나의 함수에서 자기 자신을 다시 호출해 작업을 수행하는 알고리즘
재귀를 사용한다는 것은 곧, 귀납적인 방식으로 풀이를 하는 것!
사이클이 존재하면 안된다
https://www.acmicpc.net/problem/1629
현재 n개의 원판이 있는 경우
-> 원판이 n-1개일 때 옮길 수 있으면 원판이 n개일 때에도 옮길 수 있다
위를 함수로 나타내보자
기둥은 1, 2, 3 세개가 있다
a, b, 6-a-b가 존재!!
-> n-1 개를 우선 기둥 a에서 기둥 6-a-b로 옮겨야 한다
-> n번 원판을 a에서 b로 옮긴다(출력)
-> n-1 개를 6-a-b에서 b로 옮긴다
원판 k개를 이동시키는데 A번이 필요하다 하면
k+1개를 이동하려면 k개의 원판을 빈곳으로 이동하는데 A번, k+1번째 원판을 옮기는 1번, 다시 k개의 원판을 k+1 위에 옮기는데 A번이 소요된다
-> 2A+1 번 필요, 초항도 1이므로 일반항은 2^k-1
#include <iostream>
#include <string>
#include <vector>
using namespace std;
void func(int a, int b, int n) {
if (n == 1) {
cout << a << ' ' << b << '\n';
return;
}
func(a, 6 - a - b, n - 1);
cout << a << ' ' << b << '\n'; // a에서 b로 n번째를 이동시킨 것 출력
func(6 - a - b, b, n - 1);
}
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
int k;
cin >> k;
cout << (1 << k) - 1 << '\n'; // = 2^k - 1
func(1, 3, k);
}