๐ ์ฌ๊ท(Recursion)๋?
์ฌ๊ท๋ ํจ์๊ฐ ์๊ธฐ ์์ ์ ํธ์ถํ๋ ๋ฐฉ์
์ฆ, ์ด๋ค ๋ฌธ์ ๋ฅผ ๊ฐ์ ๊ตฌ์กฐ์ ๋ ์์ ๋ฌธ์ ๋ก ๋๋์ด ํด๊ฒฐํ๋ ๋ฐฉ์์ด๋ค.
๐ ์ฌ๊ท์ ๊ธฐ๋ณธ ๊ตฌ์กฐ
function recursiveFunction() {
// 1๏ธโฃ ์ข
๋ฃ ์กฐ๊ฑด (Base Case)
if (์กฐ๊ฑด) {
return; // ์ฌ๊ท๋ฅผ ๋ฉ์ถ๋ ์กฐ๊ฑด
}
// 2๏ธโฃ ์ฌ๊ท ํธ์ถ (Recursive Case)
recursiveFunction(); // ์๊ธฐ ์์ ์ ํธ์ถ
}
โ ์ค์ํ ๊ฐ๋ :
- ๋ฐ๋์ ์ข
๋ฃ ์กฐ๊ฑด(Base Case)์ด ์์ด์ผ ํ๋ค!
- ์ข ๋ฃ ์กฐ๊ฑด์ด ์์ผ๋ฉด ํจ์๊ฐ ๋ฌดํํ ์คํ๋์ด **์คํ ์ค๋ฒํ๋ก์ฐ(Stack Overflow)**๊ฐ ๋ฐ์ํ๋ค
๐ฅ ์์ 1: 1๋ถํฐ n๊น์ง ์ถ๋ ฅํ๋ ์ฌ๊ท ํจ์
function printNumbers(n) {
if (n === 0) return; // ์ข
๋ฃ ์กฐ๊ฑด (n์ด 0์ด๋ฉด ์ข
๋ฃ)
printNumbers(n - 1); // n-1์ ์ฌ๊ท ํธ์ถ
console.log(n); // ํธ์ถ์ด ๋๋ ํ ์ถ๋ ฅ
}
printNumbers(5);
๐ ์คํ ๊ณผ์
ํจ์ ํธ์ถ | ๋์ | ์ถ๋ ฅ |
printNumbers(5) | printNumbers(4) ํธ์ถ | |
printNumbers(4) | printNumbers(3) ํธ์ถ | |
printNumbers(3) | printNumbers(2) ํธ์ถ | |
printNumbers(2) | printNumbers(1) ํธ์ถ | |
printNumbers(1) | printNumbers(0) ํธ์ถ | |
printNumbers(0) | ์ข ๋ฃ | |
ํจ์๊ฐ ๋์์ค๋ฉด์ | console.log(1) | 1 |
console.log(2) | 2 | |
console.log(3) | 3 | |
console.log(4) | 4 | |
console.log(5) | 5 |
โ ์ถ๋ ฅ ๊ฒฐ๊ณผ:
1
2
3
4
5
- printNumbers(5)๋ printNumbers(4)๋ฅผ ํธ์ถํ๊ณ , printNumbers(4)๋ printNumbers(3)์ ํธ์ถํ๋ ์ฌ๊ท ํธ์ถ์ ํจ.
- ์ฌ๊ท ํจ์๊ฐ ๋๋ ๋(n === 0)๋ถํฐ ํ๋์ฉ ๋์์ค๋ฉด์ ์ถ๋ ฅ์ด ๋จ.
~-> ์ญ์๋ ์ดํด๊ฐ ์ด๋ ต๋ค๋ฉด ์คํ๊ณผ์ ์ ์ข ๋ ์ฐฌ์ฐฌํ ๋ค์ฌ๋ค๋ณด์!
โ ์คํ ๊ณผ์ ์ดํด๋ณด๊ธฐ
์ด ์ฝ๋๋ printNumber(5)๋ฅผ ํธ์ถํ๋ฉด์ printNumber(4), printNumber(3)... ์ด๋ ๊ฒ ๊ณ์ ํธ์ถํ๋ค.
1๏ธโฃ printNumber(5)๋ฅผ ํธ์ถํ๋ฉด
→ printNumber(4) ํธ์ถ
2๏ธโฃ printNumber(4)๋
→ printNumber(3) ํธ์ถ
3๏ธโฃ printNumber(3)๋
→ printNumber(2) ํธ์ถ
4๏ธโฃ printNumber(2)๋
→ printNumber(1) ํธ์ถ
5๏ธโฃ printNumber(1)๋
→ printNumber(0) ํธ์ถ
6๏ธโฃ printNumber(0)์ ์ข
๋ฃ ์กฐ๊ฑด์ ๋ง๋ ๋ฆฌํด๋จ(๋๋จ).
์ด์ ํธ์ถํ ์์์ ๋ฐ๋๋ก ํจ์๊ฐ ๋์์ค๋ฉด์ console.log(n)์ด ์คํ๋จ!
๐ ์คํ(Stack) ๊ฐ๋ ์ ์ ์ฉํด ๋ณด์!
์๋ฐ์คํฌ๋ฆฝํธ์์ ํจ์๊ฐ ์คํ๋ ๋, ์คํ(stack) ์ด๋ผ๋ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํด.
์ฌ๊ท ํจ์๊ฐ ํธ์ถ๋ ๋๋ง๋ค ์คํ์ ์์ด๊ณ , ์ข
๋ฃ ์กฐ๊ฑด์ ๋ง๋๋ฉด ์์ธ ์์๋๋ก ๋ค์ ๋์์ ์คํ๋ผ.
printNumber(5) ํธ์ถ → printNumber(4) ํธ์ถ → printNumber(3) ํธ์ถ → printNumber(2) ํธ์ถ → printNumber(1) ํธ์ถ → printNumber(0) ํธ์ถ → ์ข
๋ฃ!
์ด์ ์์ธ ์์์ ๋ฐ๋๋ก ํ๋์ฉ ์คํ๋จ!
printNumber(1) ์คํ → printNumber(2) ์คํ → printNumber(3) ์คํ → printNumber(4) ์คํ → printNumber(5) ์คํ
์ฆ, console.log(n); ์ด ์ฌ๊ท๊ฐ ๋๋ ํ ์ฐจ๋ก๋๋ก ์คํ๋๋ฉด์ 1๋ถํฐ 5๊น์ง ์ถ๋ ฅ๋๋ค.
๐ ์คํ ํ๋ฆ์ ํ๋ก ์ ๋ฆฌํ๋ฉด
ํธ์ถ๋ ํจ์ | ์คํ์ ์์ด๋ ๊ณผ์ | ์คํ์์ ๋น ์ง๋ ๊ณผ์ (console.log ์คํ) |
printNumber(5) | printNumber(5) ํธ์ถ | console.log(5) ์คํ |
printNumber(4) | printNumber(4) ํธ์ถ | console.log(4) ์คํ |
printNumber(3) | printNumber(3) ํธ์ถ | console.log(3) ์คํ |
printNumber(2) | printNumber(2) ํธ์ถ | console.log(2) ์คํ |
printNumber(1) | printNumber(1) ํธ์ถ | console.log(1) ์คํ |
printNumber(0) | return (์ข ๋ฃ) | - |
๐ ์ค์ ์ฝ๋ ์คํ ๊ฒฐ๊ณผ
printNumber(5);
๐ฝ ์ถ๋ ฅ
1
2
3
4
5
์ 5๋ถํฐ ์ ๋์ค๊ณ 1๋ถํฐ ๋์ฌ๊น? ๐ค
→ console.log(n)์ด ์ฌ๊ท ํธ์ถ ํ ์คํ๋๊ธฐ ๋๋ฌธ!
์ฆ, printNumber(5)๊ฐ printNumber(4)๋ฅผ ํธ์ถํ๊ณ , ๋ชจ๋ ์ฌ๊ท๊ฐ ๋๋ ๋ค console.log(n)์ด ์คํ๋จ.
๐ ํ ์ค ์์ฝ
- ์ฌ๊ท ํจ์๋ ๋จผ์ ํธ์ถ์ด ๊ณ์ ์์๋ค๊ฐ(push), ์ข ๋ฃ ์กฐ๊ฑด์ ๋ง๋๋ฉด์ ํ๋์ฉ ๋น ์ง๋ฉด์(pop) ์คํ๋๋ค.
- ๊ทธ๋์ ์์ ์ซ์๋ถํฐ ์ถ๋ ฅ๋๋ ๊ฒ!
- ์ด๊ฑธ ์คํ(Last In, First Out) ๊ตฌ์กฐ๋ผ๊ณ ํ๋ค.
๐ฅ ์์ 2: ํฉํ ๋ฆฌ์ผ (Factorial) ๊ณ์ฐ
ํฉํ ๋ฆฌ์ผ(n!)์ n * (n-1) * (n-2) * ... * 1์ ๊ณ์ฐํ๋ ํจ์์ผ.
function factorial(n) {
if (n === 1) return 1; // ์ข
๋ฃ ์กฐ๊ฑด
return n * factorial(n - 1); // ์ฌ๊ท ํธ์ถ
}
console.log(factorial(5)); // 5! = 5 × 4 × 3 × 2 × 1 = 120โ
โ ์ถ๋ ฅ ๊ฒฐ๊ณผ:
120
๐ ์คํ ๊ณผ์
ํจ์ ํธ์ถ | ๋์ |
factorial(5) | 5 * factorial(4) |
factorial(4) | 4 * factorial(3) |
factorial(3) | 3 * factorial(2) |
factorial(2) | 2 * factorial(1) |
factorial(1) | 1 ๋ฐํ |
๋์์ค๋ฉด์ | 2 * 1 = 2 |
3 * 2 = 6 | |
4 * 6 = 24 | |
5 * 24 = 120 |
ํฉํ ๋ฆฌ์ผ ๊ณ์ฐ๋ ์ฌ๊ท๋ก ํ๋ฉด ์์ฃผ ์ฝ๊ฒ ๊ตฌํํ ์ ์๋ค! ๐ก
๐ ์ฌ๊ท๋ฅผ ์ฌ์ฉํ ๋ ์ฃผ์ํ ์
- ์ข
๋ฃ ์กฐ๊ฑด(Base Case)์ ๋ฐ๋์ ํ์ธ!
- ์ข ๋ฃ ์กฐ๊ฑด์ด ์์ผ๋ฉด ๋ฌดํ ๋ฃจํ์ ๋น ์ ธ์ ํ๋ก๊ทธ๋จ์ด ๋ฉ์ถ์ง ์์.
- ์คํ ์ค๋ฒํ๋ก์ฐ(Stack Overflow) ์ฃผ์!
- ๋๋ฌด ๊น์ ์ฌ๊ท ํธ์ถ์ด ๋ฐ์ํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ๊ฐ ๋ ์ ์๋ค.
- ์ด๋ฐ ๊ฒฝ์ฐ ๋ฐ๋ณต๋ฌธ(while, for)์ผ๋ก ๋ณํํ๋ ๊ฒ ๋ ๋์ ์๋ ์๋ค.
๐ ์ฌ๊ท vs ๋ฐ๋ณต๋ฌธ
โ ์ฌ๊ท
โ ์ฝ๋๊ฐ ์ง๊ด์ ์ด๊ณ ์งง์์ง.
โ ํธ๋ฆฌ, ๊ทธ๋ํ ํ์ ๋ฑ์์ ์ ์ฉํจ.
โ ์คํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ง์ด ์ฌ์ฉํด ๋นํจ์จ์ ์ผ ์๋ ์์.
โ ๊น์ด(depth)๊ฐ ์ปค์ง๋ฉด ์คํ ์ค๋ฒํ๋ก์ฐ ๋ฐ์ ๊ฐ๋ฅ.
โ ๋ฐ๋ณต๋ฌธ
โ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํ ์ ์์.
โ ์ฑ๋ฅ์ด ์ฌ๊ท๋ณด๋ค ๋ ์ข์ ๋๊ฐ ๋ง์.
โ ์ฝ๋๊ฐ ๊ธธ์ด์ง ์ ์์.
โ ๊ฒฐ๋ก
- DFS, ํฉํ ๋ฆฌ์ผ, ํผ๋ณด๋์น ์์ด ๊ฐ์ ๊ฒฝ์ฐ๋ ์ฌ๊ท๊ฐ ์ ์ฉํจ.
- ํ์ง๋ง ์ฌ๊ท ํธ์ถ์ด ๋๋ฌด ๋ง์์ง๋ฉด ๋ฐ๋ณต๋ฌธ์ผ๋ก ํด๊ฒฐํ๋ ๊ฒ์ด ์ข์.
*์ ํฌ์คํ ์ ์ฑGPT ๋ต๋ณ์ ํ ๋๋ก ์์ฑํ์ต๋๋ค!
'JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JS] filter() (0) | 2025.04.24 |
---|---|
[JS] ๊ฐ์ฒด์ ๋ฐฐ์ด์ ๊ตฌ์กฐ ๋ถํด ํ ๋น (Destructuring Assignment) (1) | 2025.03.04 |
[JS] ์ฝ๋ฉํ ์คํธ ๋๋น DFS(๊น์ด ์ฐ์ ํ์) & BFS(๋๋น ์ฐ์ ํ์) (0) | 2025.03.02 |
[JS] some()๊ณผ reduce()์ ๋ํด~ (0) | 2025.02.27 |
[JS] ์๋ฐ์คํฌ๋ฆฝํธ split() ๋ฉ์๋ (0) | 2025.02.19 |