What is Recursion? (์žฌ๊ท€ํ•จ์ˆ˜)

1. ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋ณต์žก๋„ (์žฌ๊ท€)

๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ๋Œ€ํ•œ ์ดํ•ด๋ฅผ ํ•˜๋ ค๋ฉด ์žฌ๊ท€๋‚˜ ๋ณต์žก์„ฑ ๋“ฑ์„ ์ดํ•ดํ•ด์•ผ ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. ์ค‘๊ฐ„์ค‘๊ฐ„ ์žฌ๊ท€์ ์œผ๋กœ ์‚ฌ๊ณ ํ•˜๊ธฐ, ์ž˜๊ฒŒ ์ชผ๊ฐœ์–ด ์‚ฌ๊ณ ํ•œ๋‹ค ๋ผ๋Š”๊ฒŒ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š” ๊ฑธ๊นŒ?

๋‹ค๋ฅด๊ฒŒ ๊ทธ๋ฆฌ๊ณ  ๋‹ค์–‘ํ•˜๊ฒŒ ์ƒ๊ฐํ•˜๋Š” ๋Šฅ๋ ฅ์„ ๊ธฐ๋ฅด๊ธฐ ์œ„ํ•ด์„œ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์ด๋ผ ํ•œ๋‹ค.

2. ์žฌ๊ท€

์ด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์ฃผ์–ด์กŒ๋‹ค๊ณ  ํ•˜์ž.

๋ฌธ์ œ : ์ž์—ฐ์ˆ˜์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์•„ ๋ฆฌ์ŠคํŠธ์˜ ํ•ฉ์„ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜ โ€˜arrSumโ€™ ์„ ์ž‘์„ฑํ•˜์„ธ์š”.

๊ทธ๋Ÿผ ๋ณดํ†ต ์—ฌ๊ธฐ์„œ ๊ทธ๋™์•ˆ ํ•™์Šตํ•œ ๋Œ€๋กœ ์ดˆ๊ธฐ๊ฐ’๊ณผ ๋ฐ˜๋ณต๋ฌธ์„ ์ ์šฉํ•œ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ ๋‹ค.

function arrSum(...nums) {
  let sum = 0 // 1. ๋ณด์กฐ ๋ณ€์ˆ˜ sum ์„ 0 ์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•œ๋‹ค.
  for (let i = 0; i < nums.length; i++) {
    sum = sum + nums[i] // 2. ์ˆœ์ฐจ์ ์œผ๋กœ ๋ฆฌ์ŠคํŠธ์˜ ๊ตฌ์„ฑ์š”์†Œ์— ์ ‘๊ทผํ•˜๋ฉด์„œ sum ์— ๋”ํ•œ๋‹ค.
  }
  return sum
}

์˜ˆ๋กœ ์ž์—ฐ์ˆ˜์˜ ๋ฆฌ์ŠคํŠธ [10, 3, 6, 2] ์˜ ํ•ฉ์„ ๊ตฌํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด,

arrSum([10, 3, 6, 2]) = 10 + arrSum([3, 6, 2])

arrSum([3, 6, 2]) = 3 + arrSum([6, 2])

arrSum([6, 2]) = 6 + arrSum([2])

arrSum([2]) = 2 + arrSum([])

arrSum([]) = 0
  1. ์›๋ž˜์˜ ๋ฌธ์ œ์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ๋” ์ž‘์€ ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•œ๋‹ค.
  2. ๊ณ„์†ํ•ด์„œ ๋ฌธ์ œ๊ฐ€ ๋”๋Š” ์ž‘์•„์ง€์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€ ๋” ์ž‘์€ ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•œ๋‹ค.
  3. ์ด๋ ‡๊ฒŒ ๋ฌธ์ œ ํ’€๊ธฐ๋ฅผ ๋ฏธ๋ฃจ๋‹ค๊ฐ€ ๋ฌธ์ œ๊ฐ€ ๊ฐ„๋‹จํ•ด์ ธ์„œ ๋ฐ”๋กœ ํ’€ ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ์ˆœ๊ฐ„์— ๋ฏธ๋ค„์™”๋˜ ๋ฌธ์ œ๋“ค์„ ์ฐจ๊ทผ์ฐจ๊ทผ ํ•ด๊ฒฐํ•œ๋‹ค.

์ด์ฒ˜๋Ÿผ ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๋•Œ, ๊ตฌ์กฐ๋Š” ๋™์ผํ•˜์ง€๋งŒ ๋” ์ž‘์€ ๊ฒฝ์šฐ๋ฅผ ํ•ด๊ฒฐํ•จ์œผ๋กœ์จ ๊ทธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์žฌ๊ท€ (recursion) ๋ผ๊ณ  ํ•œ๋‹ค.

arrSum([]) = 0

arrSum([2]) = 2 + arrSum([]) = 2

arrSum([6, 2]) = 6 + arrSum([2]) = 6 + 2 = 8

arrSum([3, 6, 2]) = 3 + arrSum([6, 2]) = 3 + 8 = 11

arrSum([10, 3, 6, 2]) = 10 + arrSum([3, 6, 2]) = 10 + 11 = 21

arrSum ์„ ์ฒซ๋ฒˆ์งธ๋กœ,

  1. arr ์ด ๋นˆ ๋ฐฐ์—ด์ธ ๊ฒฝ์šฐ = 0
  2. ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ, arr[0] + arrSum(arr2) // arr2๋Š” arr์˜ ์ฒซ ์š”์†Œ๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋ฐฐ์—ด

๋‹ค์‹œ ํ•œ๋ฒˆ ๋” ์ •์˜๋ฅผ ์ ์–ด๋ณด๋ฉด, arrSum ์˜ ์ธ์ž๊ฐ€ ๋นˆ ๋ฐฐ์—ด์ด ๋“ค์–ด์˜ค๋Š” ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๋ฉด ์‹คํ–‰๊ณผ์ • ์ค‘์— ์ž๊ธฐ ์ž์‹ ์„ ํ˜ธ์ถœํ•˜๊ธฐ๋„ ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ํ˜ธ์ถœ ๋ฐฉ์‹์„ ์žฌ๊ท€ ํ˜ธ์ถœ์ด๋ผ๊ณ  ํ•œ๋‹ค.

3. ์žฌ๊ท€๋Š” ์–ธ์ œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ์ข‹์€๊ฐ€?

  1. ์ฃผ์–ด์ง„ ๋ฌธ์ œ๊ฐ€ (๊ตฌ์กฐ๋Š” ๋น„์Šทํ•˜๊ณ ) ๋” ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋‰˜์–ด ์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ
  2. ์ค‘์ฒฉ๋œ ๋ฃจํ”„๊ฐ€ ๋งŽ๊ฑฐ๋‚˜ ์ค‘์ฒฉ์˜ ์ •๋„ (number of loops) ๋ฅผ ๋ฏธ๋ฆฌ ์•Œ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ

์‚ฌ์‹ค ๋ชจ๋“  ์žฌ๊ท€ ํ•จ์ˆ˜๋Š” ์žฌ๊ท€ํ˜ธ์ถœ ์—†์ด while / for loop ์œผ๋กœ ํ‘œํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

ํ•˜์ง€๋งŒ ์žฌ๊ท€๋ฅผ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ, ์žฌ๊ท€๋ฅผ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ๊ฐ€ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๋”์šฑ ๊ฐ„๊ฒฐํ•˜๊ณ , ์ผ๋ถ€์˜ ๊ฒฝ์šฐ์—๋Š” ์ดํ•ดํ•˜๊ธฐ๋„ ์‰ฝ๋‹ค๊ณ  ํ•œ๋‹ค.

4. ์žฌ๊ท€์  ์‚ฌ๊ณ ์˜ ํ๋ฆ„

  1. ์žฌ๊ท€ํ•จ์ˆ˜์˜ ์ž…๋ ฅ๊ฐ’๊ณผ ์ถœ๋ ฅ๊ฐ’ ์ •์˜ํ•˜๊ธฐ

์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ํ’€๊ณ ์ž ํ•˜๋Š”์ง€, ๋ฌธ์ œ๋ฅผ ๊ฐ€์žฅ ์ถ”์ƒ์ ์œผ๋กœ, ๋˜๋Š” ๊ฐ€์žฅ ๋‹จ์ˆœํ•˜๊ฒŒ ์ •๋ฆฌํ•œ๋‹ค.

arrSum: [number] => number

arrSum? ๊ทธ๊ฑฐ number ํƒ€์ž…์„ ์š”์†Œ๋กœ ๊ฐ–๋Š” ๋ฐฐ์—ด์„ ๋ฐ›์•„์„œ number ๋ฅผ ๋ฆฌํ„ดํ•˜๋Š”๊ฑฐ?

  1. ๋ฌธ์ œ๋ฅผ ์ชผ๊ฐœ๊ณ  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋‚˜๋ˆ„๊ธฐ

์ฃผ์–ด์ง„ ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ์ชผ๊ฐค ๊ฒƒ์ธ์ง€ ๊ณ ๋ฏผํ•ด ๋ณด๊ธฐ. ์–ด๋–ค ๊ธฐ์ค€์„ (์ผ๋ฐ˜์ ์œผ๋กœ ์ž…๋ ฅ๊ฐ’) ์ •ํ•˜๊ณ  ๊ธฐ์ค€์— ๋”ฐ๋ผ ๋ฌธ์ œ๋ฅผ ๋” ํฐ ๊ฒฝ์šฐ์™€ ์ž‘์€ ๊ฒฝ์šฐ๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ฒ€ํ† ํ•ด ๋ณธ๋‹ค.

๊ฐ€๋ น ์ž…๋ ฅ๊ฐ’์— ๋”ฐ๋ผ ์ž…๋ ฅ๊ฐ’์ด ๋นˆ ๋ฐฐ์—ด์ผ ๋•Œ ํ˜น์€ ๊ทธ๋ ‡์ง€ ์•Š์„ ๋•Œ๋กœ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด๋‹ค.

๋ฌธ์ œ๋ฅผ ์ชผ๊ฐค ๋•Œ ์ค‘์š”ํ•œ ๊ด€์ ์€ ์ˆœ์„œ, ๊ทธ๋ฆฌ๊ณ  ํฌ๊ธฐ ์ด๋‹ค.

2-1. ์ฃผ์–ด์ง„ ์ž…๋ ฅ๊ฐ’ ๋˜๋Š” ๋ฌธ์ œ ์ƒํ™ฉ์„ ํฌ๊ธฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๊ฑฐ๋‚˜,

2-2. ์ˆœ์„œ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •ํ•  ์ˆ˜ ์žˆ๋Š”์ง€

๊ทธ๋ฆฌ๊ณ  ๊ทธ๋ ‡๊ฒŒ ๊ตฌ๋ถ„๋˜์–ด์ง„ ๋ฌธ์ œ๋“ค์„ ํ‘ธ๋Š” ๋ฐฉ์‹์ด ๊ฐ™๋‹ค๋ฉด ๋ฌธ์ œ๋ฅผ ์ œ๋Œ€๋กœ ๊ตฌ๋ถ„ํ•œ ๊ฒƒ์ด๋‹ค.

  1. ๋‹จ์ˆœํ•œ ๋ฌธ์ œ ํ•ด๊ฒฐํ•˜๊ธฐ

๋ฌธ์ œ๋ฅผ ์—ฌ๋Ÿฌ ๊ฒฝ์šฐ๋กœ ๊ตฌ๋ถ„ํ•œ ๋‹ค์Œ์—๋Š” ์‰ฌ์šด ๋ฌธ์ œ๋ถ€ํ„ฐ ํ•ด๊ฒฐํ•œ๋‹ค. ์ด๋ฅผ ์žฌ๊ท€์˜ ๊ธฐ์ดˆ (base case) ๋ผ ํ•œ๋‹ค. ์žฌ๊ท€์˜ ๊ธฐ์ดˆ๋Š” ๋‚˜์ค‘์— ์žฌ๊ท€ํ•จ์ˆ˜ ๊ตฌํ˜„ ์‹œ ์žฌ๊ท€์˜ ํƒˆ์ถœ ์กฐ๊ฑด (์žฌ๊ท€ ํ˜ธ์ถœ์ด ๋ฉˆ์ถ”๋Š” ์กฐ๊ฑด) ์„ ๊ตฌ์„ฑํ•˜๊ฒŒ ๋œ๋‹ค.

arrSum ์„ ๋” ์ด์ƒ ์ชผ๊ฐค ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๋Š” ์ž…๋ ฅ๊ฐ’์ด ๋นˆ ๋ฐฐ์—ด์ธ ๊ฒฝ์šฐ์ด๊ณ , ์ด ๋•Œ arrSum ์€ 0 ์ด๋‹ค.
  1. ๋ณต์žกํ•œ ๋ฌธ์ œ ํ•ด๊ฒฐํ•˜๊ธฐ

์œ„์˜ ์˜ˆ๋กœ arrSum ์ด ๊ธธ์ด๊ฐ€ 1์ด์ƒ์ธ ๋ฐฐ์—ด์„ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์„ ๊ฒฝ์šฐ, ๋งจ ์•ž์˜ ์š”์†Œ๋ฅผ ๋”ฐ๋กœ ๊ตฌํ•˜๊ณ  ๋‚˜๋จธ์ง€ ์š”์†Œ๋ฅผ ์ƒˆ๋กœ์šด ์ž…๋ ฅ๊ฐ’์œผ๋กœ ๊ฐ–๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์—ฌ ์–ป์€ ๊ฒฐ๊ณผ๋ฅผ head ์— ๋”ํ•œ๋‹ค.

arrSum: [number] => number
arrSum([]) = 0
arrSum([e1, e2, ..., en]) = e1 + arrSum([e2, ..., en])

๋ฐฐ์—ด์ด ์žˆ์„ ๋•Œ head ์™€ ๋‚˜๋จธ์ง€๋ถ€๋ถ„ (tail) ์„ ๊ตฌ๋ถ„ํ•˜๋Š” ๋ฐฉ๋ฒ•๋งŒ ์•ˆ๋‹ค๋ฉด arrSum ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. ์ฝ”๋“œ ๊ตฌํ˜„ํ•˜๊ธฐ
function arrSum(arr) {
  if (arr.length === 0) {
    // ์žฌ๊ท€์˜ ๊ธฐ์ดˆ (base case)
    return 0 // ๋ฌธ์ œ๋ฅผ ๋” ์ด์ƒ ์ชผ๊ฐค ์ˆ˜ ์—†์„ ๋•Œ ๋‹จ์ˆœํ•œ ๋ฌธ์ œ์˜ ํ•ด๋‹ต์„ ๋ฆฌํ„ด
  }
  return head + arrSum(tail) // ๋” ์ž‘์€ ๋ฌธ์ œ๋กœ ์ƒˆ๋กญ๊ฒŒ ์ •์˜๋œ ๋ฌธ์ œ (recursive case)
}

5. ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณด๊ณ  ๋Š๋‚€ ์ 

๊ณ„์† ์—ฐ์Šต์„ ํ•ด์•ผ ์ž์ „๊ฑฐ ํƒ€๋“ฏ์ด ์ต์ˆ™ํ•ด ์งˆ ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•œ๋‹ค.


Written by@[DotoriMook]
ํ”„๋ก ํŠธ์—”๋“œ ์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž ๋„ํ† ๋ฆฌ๋ฌต์˜ ๊ธฐ์ˆ ๊ฐœ๋ฐœ ๋ธ”๋กœ๊ทธ ์ž…๋‹ˆ๋‹ค.

GitHubMediumTwitterFacebook