※ 자연수의 정의
- 1은 자연수입니다.
- 어떤 자연수의 바로 다음 수도 자연수입니다.
※ 팩토리얼 n!의 정의 ( n은 양의 정수 )
- 0! = 1
- n > 0 이면 n! = n * ( n - 1 )!
const factorial = (n: number): number => {
if (n > 0) {
return n * factorial(n - 1);
} else {
return 1;
}
};
console.log(factorial(5)); // 120
const getGCD = (x: number, y: number): number => {
if (y === 0) {
return x;
} else {
return getGCD(y, x % y);
}
};
console.log(getGCD(22, 8)); // 2
const recur = (n:number): void => {
if (n > 0) {
recur(n - 1);
console.log(n);
recur(n - 2);
}
};
recur(4);
// 1 -> 2 -> 3 -> 1 -> 4 -> 1 -> 2
// recur(4)
// -> recur(3) -> recur(2) -> recur(1)
// -> recur(0) -> console.log(1) -> recur(-1)
// -> console.log(2) -> recur(0)
// -> console.log(3) -> recur(1) -> recur(0) -> console.log(1) -> recur(-1)
// -> console.log(4) -> recur(2) -> recur(1)
// -> recur(0) -> console.log(1) -> recur(-1)
// -> console.log(2) -> recur(0)
- recur(3)을 실행합니다.
- 4를 출력합니다.
- recur(2)을 실행합니다.
☑ 왼쪽 화살표를 따라 1칸 아래쪽 상자로 이동하고, 다시 원래 호출한 상자로 되돌아오면 값을 출력
☑ 오른쪽 화살표를 따라 1칸 아래쪽 상자로 이동한다.
위의 단 계를 1번 끝내야 비로소 1칸 위쪽 상자로 올라갈 수 있다.
- recur(0)을 실행합니다.
- 1을 출력합니다.
- recur(-1)을 실행합니다.
☑ recur(0)과 recur(-1)은 출력할 내용이 없으므로 결국 1만 출력
- recur(1)을 실행합니다.
- 2를 출력합니다.
- recur(0)을 실행합니다.
☑ recur(1)은 1을 출력하지만 recur(0)은 아무것도 출력하지 않음
recur(-1) : 아무것도 하지 않음
recur(0) : 아무것도 하지 않음
-------------------------------------------
recur(1) : recur(0) 1️⃣ recur(-1) → 1️⃣
recur(2) : recur(1) 2️⃣ recur(0) → 1 2️⃣
recur(3) : recur(2) 3️⃣ recur(1) → 1 2 3️⃣ 1
recur(4) : recur(3) 4️⃣ recur(2) → 1 2 3 1 4️⃣ 1 2
- 위의 원반을 중간 기둥으로 이동
- 아래의 원반을 목표 기둥으로 이동
- 위의 원반을 목표 기둥으로 이동
- 위의 원반 두 개를 중간 기둥으로 옮김
- 마지막 원반을 목표 기둥으로 옮김
- 중간 기둥의 원반 두 개를 목표 기둥으로 옮김
- 위의 원반 세 개를 중간 기둥으로 옮김
- 마지막 원반을 목표 기둥으로 옮김
- 중간 기둥의 원반 세 개를 목표 기둥으로 옮김
const move = (n: number, x: number, y: number): void => {
const middle = 6 - x - y;
if (n > 1) {
move(n - 1, x, middle);
}
console.log(`원반 ${n}을 ${x} 기둥에서 ${y} 기둥으로 이동`);
if (n > 1) {
move(n - 1, middle, y);
}
};
move(3, 1, 3);
// 원반 1을 1 기둥에서 3 기둥으로 이동
// 원반 2을 1 기둥에서 2 기둥으로 이동
// 원반 1을 3 기둥에서 2 기둥으로 이동
// 원반 3을 1 기둥에서 3 기둥으로 이동
// 원반 1을 2 기둥에서 1 기둥으로 이동
// 원반 2을 2 기둥에서 3 기둥으로 이동
// 원반 1을 1 기둥에서 3 기둥으로 이동
64 x 63 x 62 x 61 x 60 x 59 x 58 x 57 = 178,462,987,637,760
☑ 이 모든 경우의 수를 확인하는 것은 비현실적
8 x 8 x 8 x 8 x 8 x 8 x 8 x 8 = 16,777,216
pos라는 배열을 이용하여 queen의 위치 표시
pos의 인덱스가 열, 값이 행을 의미
const pos = new Array(8).fill(0);
const put = (): void => {
console.log(...pos);
};
const set = (i: number): void => {
for (let j = 0; j < 8; j++) {
pos[i] = j;
if (i === 7) put();
else set(i + 1);
}
};
set(0);
☑ 퀸은 자신과 같은 행에 있는 다른 퀸을 공격하는 것이 가능하다
8! = 40.320
pos라는 배열을 이용하여 queen의 위치 표시
flag 배열을 통해 해당 행에 이미 배치된 queen이 있는지 확인
const pos = new Array(8).fill(0);
const flag = new Array(8).fill(false);
const put = () => {
console.log(...pos);
};
const set = (i) => {
for (let j = 0; j < 8; j++) {
if (!flag[j]) {
pos[i] = j;
if (i === 7) put();
else {
flag[j] = true;
set(i + 1);
flag[j] = false;
}
}
}
};
set(0);
pos라는 배열을 이용하여 queen의 위치 표시
flag_a 배열을 통해 해당 행에 이미 배치된 queen이 있는지 확인
flag_b 배열을 통해 우상향, 좌하향 대각선 방향으로 queen이 있는지 확인
flag_c 배열을 통해 우하향, 좌상향 대각선 방향으로 queen이 있는지 확인
const pos = new Array(8).fill(0);
const flag_a = new Array(8).fill(false);
const flag_b = new Array(15).fill(false);
const flag_c = new Array(15).fill(false);
const put = () => {
console.log(...pos);
};
const set = (i) => {
for (let j = 0; j < 8; j++) {
const B_IDX = i + j;
const C_IDX = i - j + 7;
if (!flag_a[j] && !flag_b[B_IDX] && !flag_c[C_IDX]) {
pos[i] = j;
if (i === 7) put();
else {
flag_a[j] = flag_b[B_IDX] = flag_c[C_IDX] = true;
set(i + 1);
flag_a[j] = flag_b[B_IDX] = flag_c[C_IDX] = false;
}
}
}
};
set(0);