Miyeon

Factorialize a Number

2020-08-14Algorithm

๐Ÿ”ฅํฌ์ŠคํŒ… ์ „์— ์•Œ์•„์•ผ ํ•  ํ•จ์ˆ˜์˜ ํŠน์„ฑ

  • ํ•จ์ˆ˜ return์„ ๋งŒ๋‚˜๋ฉด ์ œ์–ด๊ถŒ์ด ํ•จ์ˆ˜ ๋ฐ–์œผ๋กœ ๋‚˜๊ฐ€๊ฒŒ ๋œ๋‹ค.
  • ๋ฆฌํ„ด์ด ์—†๋Š” ํ•จ์ˆ˜๋Š” undefined๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

๐Ÿ”ฅFactorialize a Number๋ฅผ ๊ตฌํ•ด๋ณด์ž

โžก๏ธ ์ฒซ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•

function factorialize(num) {
  let product;
  for (product = 1; num > 0; num--) {
    product *= num;
  }
  return product;
}

factorialize(5);

์ฝ”๋“œ ํ•ด์„

  • product ๋ณ€์ˆ˜๊ฐ€ 1๋กœ ์ดˆ๊ธฐํ™”๋˜์–ด ์žˆ๋‹ค.
  • num = 0์ธ ๊ฒฝ์šฐ์— ๋ฃจํ”„ ์กฐ๊ฑด์ด ๊ฑฐ์ง“์ด๋ฏ€๋กœ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ 
  • product๊ฐ€ 1๋กœ ์ดˆ๊ธฐํ™”๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌํ„ด๋ฌธ์ด ์‹คํ–‰๋  ๊ฒƒ์ด๋‹ค.


โžก๏ธ ๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•

๐Ÿ”ฅ ๊ธฐ๋ณธ ์žฌ๊ท€ ํ•จ์ˆ˜

  • ์žฌ๊ท€ํ•จ์ˆ˜๋ž€ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์ž๊ธฐ ์ž์‹ ์„ ํ˜ธ์ถœํ•ด์„œ ์‹คํ–‰ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งํ•œ๋‹ค
function factorialize(num) {
  if (num === 0) {
    return 1;
  }
  // ํ•จ์ˆ˜๊ฐ€ ๋‹ค์‹œ ํ˜ธ์ถœ๋ ๋•Œ ์ธ์ž๋กœ num-1์„ ์ „๋‹ฌํ•จ
  return num * factorialize(num - 1);
}
factorialize(5);

์ฝ”๋“œ ํ•ด์„

  • ์žฌ๊ท€ํ•จ์ˆ˜์‚ฌ์šฉ
  • num === 0์ด๋ผ๋ฉด 1์„ ๋ฆฌํ„ดํ•˜๊ณ  ์žฌ๊ท€๋ฅผ ๋๋‚ธ ๋’ค ์Šคํƒ์—๊ฒŒ ์ƒ์œ„ ๋ ˆ๋ฒจ๋กœ ์ด ๊ฐ’์„ ์ „ํŒŒํ•˜๋ผ๊ณ  ์•Œ๋ ค์ค€๋‹ค.
  • ๋งŒ์•ฝ ์ด ์กฐ๊ฑด์„ ๊ฐ€์ง€์ง€ ์•Š๋Š”๋‹ค๋ฉด ์žฌ๊ท€๋Š” ์Šคํƒ์ด ๋‚ญ๋น„๋  ๋•Œ๊นŒ์ง€ ๊ณ„์† ๋ฐ˜๋ณต๋  ๊ฒƒ์ด๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ‰๊ฐ€ ์ˆœ์„œ

factorialize(5)๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด

factorialize(5);
5 * factorialize(4);
5 * 4 * factorialize(3);
5 * 4 * 3 * factorialize(2);
5 * 4 * 3 * 2 * factorialize(1);
5 * 4 * 3 * 2 * 1;

120;

๐Ÿ”ฅ ๋˜ ๋‹ค๋ฅธ ์žฌ๊ท€ํ•จ์ˆ˜, ๊ผฌ๋ฆฌ ํ•จ์ˆ˜

function factorialize(num, factorial = 1) {
  if (num == 0) {
    return factorial;
  } else {
    return factorialize(num - 1, factorial * num);
  }
}

factorialize(5);

์ฝ”๋“œ ํ•ด์„

  • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ์ตœ์ ํ™”ํ•˜๊ธฐ์œ„ํ•ด์„œ Tail Recursion ์‚ฌ์šฉํ–ˆ๋‹ค.
  • ์žฌ๊ท€ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ๊ฐœ๋ณ„๋กœ ํ‰๊ฐ€ํ•ด์„œ factorial๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ‰๊ฐ€ ์ˆœ์„œ

factorialize(5, 1);
factorialize(4, 5);
factorialize(3, 20);
factorialize(2, 60);
factorialize(1, 120);
factorialize(0, 120);

120;

๐Ÿ”ฅ head recursion๊ณผ tail recursion์˜ ์ฐจ์ด

head recursion

  • ์žฌ๊ท€ ํ˜ธ์ถœ์„ ๋จผ์ €ํ•˜๊ณ  ๊ทธ ๋‹ค์Œ์— ํ˜ธ์ถœ์˜ ๋ฆฌํ„ด ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
  • ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ์žฌ๊ท€ ํ˜ธ์ถœ์„ ๋ฆฌํ„ดํ•  ๋•Œ๊นŒ์ง€ ๊ณ„์‚ฐ์˜ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์—†๋‹ค.
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•ด์„๊ธฐ๊ฐ€ ํ‰๊ฐ€๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ์žฌ๊ท€ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.

tail recursion

  • tail ์žฌ๊ท€์—์„œ๋Š” ๊ณ„์‚ฐ์„ ๋จผ์ €ํ•˜๊ณ  ํ˜„์žฌ ์Šคํ…์˜ ๊ฐ’์„ ๋‹ค์Œ ์žฌ๊ท€ ์Šคํ…์œผ๋กœ ์ „๋‹ฌํ•˜๋ฉด์„œ ๊ทธ ๋‹ค์Œ์— ์žฌ๊ท€ ํ˜ธ์ถœ์„ ์‹คํ–‰ํ•œ๋‹ค.
  • ๊ฐ๊ฐ์˜ ์žฌ๊ท€ ํ˜ธ์ถœ์„ ํ‰๊ฐ€ํ•˜๋ฉด์„œ factorial์€ ์—…๋ฐ์ดํŠธ ๋œ๋‹ค.
  • ๋ฒ ์ด์Šค ์ผ€์ด์Šค์— ๋„๋‹ฌํ•  ๋•Œ๊นŒ์ง€ ๋ชจ๋“  ํ‰๊ฐ€์™€ ๊ณ„์‚ฐ์ด ์Šคํƒ์— ์ €์žฅ๋˜๋Š” ํ—ค๋“œ ์žฌ๊ท€ํ•จ์ˆ˜์™€ ๋‹ค๋ฅธ ์ ์ด๋‹ค.

์ฐธ๊ณ 

Factorialize a Number?
Tail recursion