JavaScript

[JS] ์žฌ๊ท€ ๊ธฐ๋Šฅ

Irene1988 2025. 3. 2. 23:42

๐Ÿš€ ์žฌ๊ท€(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 ๋‹ต๋ณ€์„ ํ† ๋Œ€๋กœ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค!