
์ฌ๊ทํจ์๋ฅผ ์ธ์ ์จ์ผ ํ๋์ง๊ฐ ์ค์ํ๋ฐ, ๋๊ฐ์ ๋์์ ์ผ์ ํ ๊ท์น๊ณผ ๊ฐ๊ฒฉ์ ๊ฐ์ง ์๋ค์ ์ฒ๋ฆฌํ ๋ ์ฌ์ฉ๋๋ค.
์ฌ๊ทํจ์๋ฅผ ์ฌ์ฉํ ๋ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ์ข ๋ฃ ์กฐ๊ฑด์ ์ค์ ํด์ ์ด๋์ ๋ฉ์ถ์ง๋ฅผ ์ ํด์ผ ๋์์ด ๋ฐ๋ณต๋๋ ๊ฒ์ ๋ง์ ์ ์๋ค๋ ์ ์ด๋ค.
๋ํ, ์ฌ๊ทํจ์์ ๋ฆฌํด๊ฐ์ด ์ญ์์ผ๋ก ์ถ๋ ฅ๋๋ ๊ฒ์ ๋ณด๋ฉด ์คํ(Stack) ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํจ์ ์ ์ ์๋ค.
๋ง์ฝ์ ์ญ์์ด ์๋๋ผ ์ ์์ผ๋ก ์ถ๋ ฅ๋๊ธฐ๋ฅผ ์๋ํ๋ค๋ฉด, ์ฝ๋์ ์์๋ง ๋ฐ๊ฟ์ฃผ๋ฉด ๋๋ค.
1. ์ฌ๊ท ํจ์๋?
์ฌ๊ท ํจ์๋ ๋ฌธ์ ๋ฅผ “๋ ์์ ๋ฌธ์ ”๋ก ์ชผ๊ฐ์ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ฌ๊ท๋ฅผ ์ดํดํ๋ ค๋ฉด ๋ ๊ฐ์ง ํต์ฌ ๊ฐ๋ ์ ์์์ผ ํ๋ค:
1. ์ข ๋ฃ ์กฐ๊ฑด (Base Case)
• ์ฌ๊ท ํจ์๋ ๊ณ์ ์์ ์ ํธ์ถํ๋ค ๋ณด๋ฉด ๋์์ด ๋ฐ๋ณต๋ ์ ์๋ค.
๊ทธ๋์ ์ด๋์ ๋ฉ์ถ์ง๋ฅผ ์ ํด์ผ ํ๋ค. ์ข ๋ฃ ์กฐ๊ฑด์ ์ฌ๊ท ํธ์ถ์ ๋ฉ์ถ๊ณ ๋ต์ ๋ฐํํ๋ ์ญํ ์ ํ๋ค
2. ์์ ๋ฌธ์ ๋ก ์ชผ๊ฐ๊ธฐ
• ๋ฌธ์ ๋ฅผ ์ ์ ๋ ์์ ๋ฌธ์ ๋ก ๋๋์ด์ ํด๊ฒฐํ๋ค.
๊ฒฐ๊ตญ, ์์ ๋ฌธ์ ๋ค์ด ์ข ๋ฃ ์กฐ๊ฑด์ ๋ง๋๋ฉด์ ๋ต์ด ์ ์ ๋ง๋ค์ด์ง๋ค.
์ฌ๊ท ํจ์์ ์: ์ซ์ ์ธ๊ธฐ
๋ฌธ์ :
์ซ์ 1๋ถํฐ n๊น์ง ์ฐจ๋ก๋ก ์ถ๋ ฅํ๋ ์ฌ๊ท ํจ์๋ฅผ ๋ง๋ค์ด๋ณด์ธ์.
public class RecursionExample {
public static void printNumbers(int n) {
if (n == 0) { // ์ข
๋ฃ์กฐ๊ฑด : n์ด 0์ด๋ฉด ๋ฉ์ถค
return;
}
printNumbers(n - 1); // n๋ณด๋ค ์์ ์ซ์๋ฅผ ์ถ๋ ฅ(์์ ๋ฌธ์ ๋ก ์ชผ๊ฐ๊ธฐ)
System.out.println(n); // ์ซ์ ์ถ๋ ฅ
}
public static void main(String[] args) {
printNumbers(5); //1, 2, 3, 4, 5 ์ถ๋ ฅ
}
}
์ฌ๊ท์ ๋์ ๊ณผ์ (๋จ๊ณ๋ณ)
printNumbers(5)๋ฅผ ํธ์ถํ๋ฉด ์๋์ ๊ฐ์ด ์๋ํ๋ค:
1. printNumbers(5) → ํธ์ถ → printNumbers(4) ํธ์ถ
2. printNumbers(4) → ํธ์ถ → printNumbers(3) ํธ์ถ
3. printNumbers(3) → ํธ์ถ → printNumbers(2) ํธ์ถ
4. printNumbers(2) → ํธ์ถ → printNumbers(1) ํธ์ถ
5. printNumbers(1) → ํธ์ถ → printNumbers(0) ํธ์ถ
6. ์ข ๋ฃ ์กฐ๊ฑด์ ๋๋ฌ: n == 0 → ์๋ฌด๊ฒ๋ ํ์ง ์๊ณ ์ข ๋ฃ.
7. ์ด์ ์ญ์์ผ๋ก ๋ฐํํ๋ฉฐ ์ซ์๋ฅผ ์ถ๋ ฅ:
• printNumbers(1) → 1 ์ถ๋ ฅ.
• printNumbers(2) → 2 ์ถ๋ ฅ.
• printNumbers(3) → 3 ์ถ๋ ฅ.
• printNumbers(4) → 4 ์ถ๋ ฅ.
• printNumbers(5) → 5 ์ถ๋ ฅ.
< System.out.println(n)์ด ๋ฐ๋ก ์คํ๋์ง ์๋ ์ด์ >
์ด ์ค์ ์ฌ๊ท ํธ์ถ์ ๋ฐ์์ํค๋ฉฐ, ํ์ฌ ํจ์์ ์คํ์ ๋ฉ์ถ๊ณ n-1์ ๋ํด ๋จผ์ ์คํ๋๋๋ก ํ๋ค.printNumbers(n - 1);โ
• ์ฆ, printNumbers(n - 1)์ด ๋๋ ๋๊น์ง ํ์ฌ ํจ์๋ ๋๊ธฐํ๊ณ ์๋ค.
• ๋ชจ๋ ์ฌ๊ท ํธ์ถ์ด ์ข ๋ฃ๋ ํ์์ผ System.out.println(n)์ด ์คํ๋๋ค.
<ํญ์ ์ญ์์ด ๋์ง ์๋ ๊ฒฝ์ฐ - ๋ง์ฝ System.out.println(n)์ ๋จผ์ ์คํํ๊ณ ์ถ๋ค๋ฉด? >
1. ์ฌ๊ท ํธ์ถ ์ ์ ์์ ์ ์ํ:
• ํธ์ถ ์ ์ ์์ ์ ์คํํ๋ฉด, ์ฌ๊ท ํธ์ถ์ด ์งํ๋๋ ๋์ ์์ ์ด ์ ์์ผ๋ก ์คํ๋๋ค.
์ฌ๊ท ํธ์ถ ์ ์ ์ถ๋ ฅํ๋๋ก ์์๋ฅผ ๋ฐ๊พธ๋ฉด ๋๋ค.
public static void printNumbers(int n) { if (n == 0) { // ์ข ๋ฃ ์กฐ๊ฑด return; } System.out.println(n); // ์ซ์ ์ถ๋ ฅ ๋จผ์ printNumbers(n - 1); // n๋ณด๋ค ์์ ์ซ์ ์ถ๋ ฅ }โ
์ถ๋ ฅ ๊ฒฐ๊ณผ:
5, 4, 3, 2, 1
2. ์คํ์ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ:
• ํน์ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ๊ท ๋์ ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ๊ฑฐ๋, ์คํ ๋์ ํ(์ ์ ์ ์ถ, FIFO)๋ฅผ ์ฌ์ฉํด ์ ์์ผ๋ก ์คํํ ์ ์๋ค.
• ์: BFS(๋๋น ์ฐ์ ํ์)๋ ํ๋ฅผ ์ฌ์ฉํด ์ ์์ผ๋ก ์คํ๋๋ค.
< ์ฌ๊ท๊ฐ ์ญ์์ผ๋ก ์คํ๋๋ ์ด์ >
์คํ์ ํน์ฑ ๋๋ฌธ์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ๊ท๋ ์๋ ์์๋ก ์งํ๋๋ค:
1. ํธ์ถ(์คํ์ ์์):
• ํจ์๊ฐ ํธ์ถ๋๋ฉด, ํธ์ถ ์ ๋ณด๊ฐ ์คํ์ ์์ธ๋ค.
• ์ฌ๊ท ํธ์ถ์ด ์ข ๋ฃ ์กฐ๊ฑด์ ๋๋ฌํ๊ธฐ ์ ๊น์ง ๊ณ์ ์์ธ๋ค.
2. ๋ฐํ(์คํ์์ ๊บผ๋):
• ์ข ๋ฃ ์กฐ๊ฑด์ ๋๋ฌํ๋ฉด ๋ฐํ์ด ์์๋๋ค.
• ์ด๋ ์คํ์ ๋ง์ง๋ง์ ์์ธ ํธ์ถ๋ถํฐ ์์ฐจ์ ์ผ๋ก ๋ฐํ๋๋ค.
์ด ๋๋ฌธ์ “์ฌ๊ท ํธ์ถ์ด ๋๋ ๋ค”์ ์์ (์: System.out.println(n))์ ์ญ์์ผ๋ก ์คํ๋๋ ๊ฒ์ด๋ค
์คํ์ ํน์ฑ(ํ์ ์ ์ถ) ๋๋ฌธ์, ์ฌ๊ท ํธ์ถ ์ดํ์ ์์ ์ ์ผ๋ฐ์ ์ผ๋ก ์ญ์์ผ๋ก ์คํ๋๋ค.
ํ์ง๋ง ์์ ์ ์ฌ๊ท ํธ์ถ ์ ์ ์ํํ๊ฑฐ๋, ๋ค๋ฅธ ์๋ฃ๊ตฌ์กฐ(์: ํ)๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์์ผ๋ก ์คํ๋ ์๋ ์๋ค.
2. ์ฌ๊ท์ ์๋ฆฌ ์คํ(Stack)

์ฌ๊ท ํจ์๋ ์ปดํจํฐ์ ์คํ(Stack) ๊ตฌ์กฐ๋ฅผ ์ด์ฉํด ์๋ํ๋ค.
• ์คํ์ด๋
์คํ์ “์ ์๋ฅผ ์์ ์ฌ๋ฆฌ๋” ๊ตฌ์กฐ์ ๋น์ทํ๋ค.
• ํ์ ์ ์ถ(LIFO, Last In First Out):
๋ง์ง๋ง์ ๋ค์ด์จ ์ ์๊ฐ ๋จผ์ ๋๊ฐ๋ค. ์ ์ผ ๋จผ์ ๋ค์ด์จ ์ ์๋ ์ ์ผ ๋ง์ง๋ง์ ๋๊ฐ๋ค.
์ฌ๊ท ํธ์ถ์ ์คํ ๋์:
• ํจ์๊ฐ ํธ์ถ๋๋ฉด ์คํ์ ์์ธ๋ค.
• ์ข ๋ฃ ์กฐ๊ฑด์ ๋๋ฌํ๋ฉด ํจ์๊ฐ ํ๋์ฉ ์คํ์์ ๋น ์ง๋ฉด์ ํด๊ฒฐ๋๋ค.
๊ทธ๋์ ์ญ์์ผ๋ก ๋ฐํํ์ฌ ์ซ์๋ฅผ ์ถ๋ ฅํ๋ ๊ฒ์ด๋ค.
3. ์ฌ๊ท ํจ์๋ก ํด๊ฒฐํ๊ธฐ ์ข์ ๋ฌธ์
์ฌ๊ท๋ ๋ฐ๋ณต๋ฌธ์ผ๋ก ํ ์ ์๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
ํ์ง๋ง, ํนํ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ์ ์ ํฉํ๋ค:
1. ํฉํ ๋ฆฌ์ผ ๊ณ์ฐ :
n! = n * (n-1)!
๋ฌธ์ ๋ฅผ ์ ์ ์๊ฒ ๋๋๊ธฐ ์ฌ์.
2. ํผ๋ณด๋์น ์์ด:
F(n) = F(n-1) + F(n-2)
์์ด ๊ณ์ฐ ๋ฌธ์ .
3. ํ์ ์๊ณ ๋ฆฌ์ฆ: - ๋์ง์ ๊ณผ ๋ด๊ฐ ๋ช ๋ฒ ๋ฐ๋ณตํ ์ง ์์ง ๋ชปํ๋ ๊ฒฝ์ฐ.
• ์: ๋ฏธ๋ก ์ฐพ๊ธฐ, ๊ทธ๋ํ ํ์(DFS).
4. ๋ถํ ์ ๋ณต ๋ฌธ์ :
• ํฐ ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ๋ก ๋๋ ์ ํธ๋ ์๊ณ ๋ฆฌ์ฆ (์: ๋ณํฉ ์ ๋ ฌ, ํต ์ ๋ ฌ).
์ฌ๊ท๋ฅผ ์ฐ์ตํ ๋ ์ฃผ์ํ ์
1. ํญ์ ์ข ๋ฃ ์กฐ๊ฑด์ ๋ช ํํ ์์ฑํด์ผ ํ๋ค.
• ์ข ๋ฃ ์กฐ๊ฑด์ด ์์ผ๋ฉด ๋ฌดํ ๋ฃจํ์ ๋น ์ง๋ค.
2. ์์ ๋ฌธ์ ๋ก ์ชผ๊ฐ๋ ๋ ผ๋ฆฌ๋ฅผ ๋ช ํํ ์ดํดํด์ผ ํ๋ค.
• ํฐ ๋ฌธ์ ๋ฅผ ์๊ฒ ์ชผ๊ฐ์ผ ์ฌ๊ท๊ฐ ์ ์๋ํ๋ค.
3. ๋ฐ๋ณต๋ฌธ๊ณผ ๋น๊ตํ๋ฉด์ ์ฌ๊ท๋ฅผ ์ฐ์ตํด์ผ ํ๋ค.
• ์ฌ๊ท์ ๋ฐ๋ณต๋ฌธ์ ์๋ก ๋ฐ๊ฟ ์ธ ์ ์๋ค.