Updated:

์žฌ๊ท€ํ•จ์ˆ˜๋ž€?

์žฌ๊ท€(Recursion) : ์žฌ๊ท€๋Š” ์–ด๋– ํ•œ ๊ฒƒ์„ ์ •์˜ํ•  ๋•Œ ์ž๊ธฐ ์ž์‹ ์„ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์„ ๋œปํ•œ๋‹ค

// 1 ~ num ๊นŒ์ง€์˜ ๊ณฑ์„ ๊ตฌํ•˜๊ธฐ
function calculate(num){
  if(num === 1) return 1
  
  return num * calculate(num - 1)
}

calculate(4) // 24  <-  4 * 3 * 2 * 1 ์˜ ๊ฒฐ๊ณผ

์žฌ๊ท€ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜ ์•ˆ์—์„œ ์ž๊ธฐ ์ž์‹ (ํ•จ์ˆ˜)์„ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ํ•œ๋ฒˆ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ๋˜๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋‹ค์‹œ ๋™์ž‘ํ•˜๊ฒŒ๋˜๊ณ , ์ •ํ•ด์ง„ ์กฐ๊ฑด์— ๋งŒ์กฑํ•˜๊ฒŒ๋˜๋ฉด ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํ„ดํ•˜๊ฒŒ ๋œ๋‹ค.
while ๋ฐ˜๋ณต๋ฌธ๊ณผ ํก์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— while๋กœ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” ์žฌ๊ท€ํ•จ์ˆ˜๋กœ๋„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
๋‹ค๋งŒ, ๋ณต์žกํ•œ ์กฐ๊ฑด์ด ๊ฑธ๋ ค์žˆ๋Š” ๊ฒฝ์šฐ ์žฌ๊ท€ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„ํ•˜๋Š”๊ฒŒ ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ๊ธฐ์— ์ƒํ™ฉ์— ๋งž๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.


์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ(Stack Overflow) ์™€ ๊ผฌ๋ฆฌ์žฌ๊ท€(Tail Recursion)

์žฌ๊ท€ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ํ•  ๋•Œ ๋งˆ๋‹ค ๋ฉ”๋ชจ๋ฆฌ์˜ ์Šคํƒ(Stack)์ด๋ผ๋Š” ์˜์—ญ์— ์ €์žฅ๋˜๋Š”๋ฐ, ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํšŸ์ˆ˜๊ฐ€ ๋งŽ์•„์ ธ์„œ ์ง€์ •๋œ ์Šคํƒ ์˜์—ญ์„ ์ดˆ๊ณผํ•˜๋ฉด Stack Overflow ๋ผ๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ๋ณด์™„ํ•˜๊ณ ์ž ๊ผฌ๋ฆฌ์žฌ๊ท€ ๋ผ๋Š” ๊ธฐ๋ฒ•์ด ๋‚˜์˜ค๊ฒŒ ๋˜์—ˆ๋‹ค.

// ์ผ๋ฐ˜ ์žฌ๊ท€ ํ˜•์‹
function calculate(num){
  if(num === 1) return 1
  
  return num * calculate(num - 1)
}
calculate(4) // 24


//  ๊ผฌ๋ฆฌ ์žฌ๊ท€ ํ˜•์‹
function calculateTail(num, total = 1){
  if(num === 1) return total
  
  return calculateTail(num - 1, num * total)
}
calculateTail(4) // 24

์ผ๋ฐ˜ ์žฌ๊ท€ ํ˜•์‹์€ return ์ดํ›„์— ์žฌ๊ท€ ํ•จ์ˆ˜์˜ ์—ฐ์‚ฐ์ด ์‹œ์ž‘๋˜๋Š”๋ฐ,
๊ผฌ๋ฆฌ ์žฌ๊ท€ ํ˜•์‹์€ return ํ•˜๊ธฐ ์ „์— ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์—ฐ์‚ฐํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์—ฐ์‚ฐ์ด ์ด๋ฃจ์–ด์ง€๋Š” ์œ„์น˜์˜ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค๊ณ  ๋ณด๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

์ฐธ๊ณ  ๋งํฌ:
https://yeonjewon.tistory.com/80
https://bentist.tistory.com/57
https://catsbi.oopy.io/dbcc8c79-4600-4655-b2e2-b76eb7309e60


์žฌ๊ท€ํ•จ์ˆ˜๋กœ ๊ตฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ

  • ํŒฉํ† ๋ฆฌ์–ผ(factorial, 1์—์„œ n๊นŒ์ง€์˜ ๊ณฑ)

function calculate(num){
  if(num === 1) return 1
  
  return num * calculate(num - 1)
}

calculate(4) // 24
  • ๊ฑฐ๋“ญ์ œ๊ณฑ ๊ตฌํ•˜๊ธฐ (x^n)

function calculate(x, num){
  if(num === 1) return x
  
  return x * calculate(x, num - 1)
}

calculate(2, 10) // 1024
  • 2์ง„์ˆ˜ ๊ตฌํ•˜๊ธฐ

const ์ง„๋ฒ• = 2

function binary(number){
  let result = ""

  function calculate(num){
    if(num === 0) return ''
    calculate(Math.floor(num / ์ง„๋ฒ•))
    result += num % ์ง„๋ฒ•
  }
  
  calculate(number)
  
  return result
}

binary(20) // '10100'
  • ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜ ๊ตฌํ•˜๊ธฐ - ์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ•(Euclidโ€™s Algorithm)

function calculate(a, b){
  if(a < b){
    let tmp
    tmp = a;
    a = b;
    b = tmp;
  }
  
  if(a % b === 0) return b
  else return calculate(b, a%b)  
}

calculate(4, 15) // 1
calculate(4, 16) // 4

์ตœ์†Œ๊ณต๋ฐฐ์ˆ˜๋Š” ๋‘ ์ˆ˜์˜ ๊ณฑ์„ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜๋กœ ๋‚˜๋ˆ„๋ฉด ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค. a * b / caculate(a, b)

function fib(num){
  if(num <= 1) return num
  return fib(num -1) + fib(num -2)
}

fib(0) // 0
fib(1) // 1
fib(2) // 1
fib(3) // 2
fib(4) // 3
fib(5) // 5
fib(6) // 8

ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์€ ์ฒซ ๋ฒˆ์งธ ํ•ญ๊ณผ ๋‘ ๋ฒˆ์งธ ํ•ญ์ด 1์ด๋ฉฐ ๊ทธ ๋’ค์˜ ํ•ญ์€ ๋ฐ”๋กœ ์•ž ๋‘ ํ•ญ์˜ ํ•ฉ์ธ ์ˆ˜์—ด์ด๋‹ค. ์ด ์ˆ˜์—ด์˜ ํ•ญ์„ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜(Fibonacci Number)๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ํŽธ์˜์ƒ 0์„ 0๋ฒˆ์งธ ํ•ญ์œผ๋กœ ๋†“๊ธฐ๋„ ํ•œ๋‹ค.

num fib(num -1) + fib(num -2) return (ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜)
0 ย  0
1 ย  1
2 1 + 0 1
3 1 + 1 2
4 2 + 1 3
5 3 + 2 5
6 5 + 3 8

์ฐธ๊ณ  ๋งํฌ:
https://wayhome25.github.io/cs/2017/04/15/cs-16-1-recursion/

Leave a comment