ํฌ์ŠคํŠธ

๐ŸŒ“ Recursion ์žฌ๊ท€

๐Ÿ’ซ ์ •์˜


ํ•˜๋‚˜์˜ ํ•จ์ˆ˜์—์„œ ์ž๊ธฐ ์ž์‹ ์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ๋“ฌ

์–ด๋–ค ๋ฌธ์ œ๋ฅผ ์žฌ๊ท€๋กœ ํ‘ผ๋‹ค๋Š” ๊ฒƒ์€ ๊ณง ๊ท€๋‚ฉ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ฒ ๋‹ค๋Š” ๊ฒƒ
๊ท€๋‚ฉ์ ์ธ ๋ฐฉ์‹ -> ์ผ๋ฐ˜์ ์ธ ์ƒ์‹๊ณผ๋Š” ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค

์ผ๋ฐ˜์ ์œผ๋กœ, ์ˆœ์„œ์— ๋”ฐ๋ผ ํ•ด์•ผํ•  ์ผ์ด ์ •ํ•ด์ ธ์žˆ๋Š” ์ฝ”๋“œ
๊ท€๋‚ฉ์ ์œผ๋กœ

์ œ์ผ ์•ž์— ์žˆ๋Š” ๋„๋ฏธ๋…ธ๋ฅผ ์“ฐ๋ŸฌํŠธ๋ฆฌ๋ฉด ๋ชจ๋“  ๋„๋ฏธ๋…ธ๊ฐ€ ์“ฐ๋Ÿฌ์ง€๊ฒ ์ฃ 

์™œ ๋ชจ๋“  ๋„๋ฏธ๋…ธ๊ฐ€ ์“ฐ๋Ÿฌ์ง€๋Š”๊ฐ€?
์•ž์—์„œ๋ถ€ํ„ฐ 1๋ฒˆ 2๋ฒˆ ๋„๋ฏธ๋…ธ๋ผ๊ณ  ํ•œ๋‹ค๋ฉด

  1. 1๋ฒˆ ๋„๋ฏธ๋…ธ๊ฐ€ ์“ฐ๋Ÿฌ์ง€๋ฉด 2๋ฒˆ ๋„๋ฏธ๋…ธ๊ฐ€ ์“ฐ๋Ÿฌ์ง€๊ณ , 2๋ฒˆ ๋„๋ฏธ๋…ธ๊ฐ€ ์“ฐ๋Ÿฌ์ง€๋ฉด 3๋ฒˆ ๋„๋ฏธ๋…ธ๊ฐ€ ์“ฐ๋Ÿฌ์ง€๊ณ , โ€ฆ ์ด๋Ÿฐ์‹์œผ๋กœ ๊ณ„์† ์ง„ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๋„๋ฏธ๋…ธ๊ฐ€ ์“ฐ๋Ÿฌ์ง„๋‹ค
  2. ์ˆ˜ํ•™์  ๊ท€๋‚ฉ๋ฒ•
    • 1๋ฒˆ ๋„๋ฏธ๋…ธ๊ฐ€ ์“ฐ๋Ÿฌ์ง„๋‹ค
    • k๋ฒˆ ๋„๋ฏธ๋…ธ๊ฐ€ ์“ฐ๋Ÿฌ์ง€๋ฉด k+1๋ฒˆ ๋„๋ฏธ๋…ธ๋„ ์“ฐ๋Ÿฌ์ง„๋‹ค

2๋ฒˆ ๋งŒ์„ ์ƒ๊ฐํ•œ ํ›„์— ๋ฐ”๋กœ ๋ชจ๋“  ๋„๋ฏธ๋…ธ๊ฐ€ ์“ฐ๋Ÿฌ์ง„๋‹ค๋Š” ๊ฒฐ๋ก ์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค
์ฆ‰, ์šฐ๋ฆฌ๊ฐ€ ์ง€๊ธˆ๊นŒ์ง€ ๋‹น์—ฐํ•˜๊ฒŒ ์ƒ๊ฐํ•˜๋˜ ์ ˆ์ฐจ์ง€ํ–ฅ์ ์ธ ์‚ฌ๊ณ ๋ฅผ ํƒˆํ”ผํ•ด์•ผ ํ•œ๋‹ค

1
2
3
4
5
6
void func1(int n)
{
	if (n == 0) return;
	cout << n << ' ';
	func1(n - 1);
}

์ ˆ์ฐจ์ง€ํ–ฅ์ ์ธ ์‚ฌ๊ณ ๋กœ func1(3) ๊ฒฐ๊ณผ๊ฐ€ ์™œ 3 2 1์ธ์ง€ ์ƒ๊ฐํ•ด๋ณธ๋‹ค๋ฉด
์ด ์ฝ”๋“œ๊ฐ€ ๋™์ž‘ํ•˜๋Š” ํ๋ฆ„์„ ๊ทธ๋Œ€๋กœ ๋”ฐ๋ผ๊ฐ€๋ฉด ๋œ๋‹ค
func1(3)์ด ํ˜ธ์ถœ๋˜๋ฉด 3์„ ์ถœ๋ ฅํ•˜๊ณ  func1(2)์„ ํ˜ธ์ถœ
func1(2)์ด ํ˜ธ์ถœ๋˜๋ฉด 2์„ ์ถœ๋ ฅํ•˜๊ณ  func1(1)์„ ํ˜ธ์ถœ
func1(1)์ด ํ˜ธ์ถœ๋˜๋ฉด 1์„ ์ถœ๋ ฅํ•˜๊ณ  func1(0)์„ ํ˜ธ์ถœ
func1(0)์ด ํ˜ธ์ถœ๋˜๋ฉด ์ข…๋ฃŒ
์ด๋ ‡๊ฒŒ ๊ณผ์ •์„ ๋”ฐ๋ผ๊ฐ€๊ณ  ๋‚˜๋ฉด func1(3)์„ ์‹คํ–‰ํ–ˆ์„ ๋•Œ 3 2 1์ด ์ถœ๋ ฅ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค

๊ท€๋‚ฉ์  ์‚ฌ๊ณ 
func1 ํ•จ์ˆ˜๊ฐ€ n๋ถ€ํ„ฐ 1๊นŒ์ง€ ์ฐจ๋ก€๋กœ ์ถœ๋ ฅํ•˜๋Š” ํ•จ์ˆ˜์ž„์„ ๊ท€๋‚ฉ์ ์ธ ์‚ฌ๊ณ ๋กœ ์ดํ•ด

  1. func1(1)์ด 1์„ ์ถœ๋ ฅํ•œ๋‹ค. ์ž๋ช…ํ•œ ์‚ฌ์‹ค
  2. _
    1. func1(k)๊ฐ€ k k-1 k-2 โ€ฆ 1 ์„ ์ถœ๋ ฅํ•˜๋ฉด, ์ฆ‰ k๋ถ€ํ„ฐ 1๊นŒ์ง€ ์ถœ๋ ฅํ•˜๋ฉด
    2. func1(k+1)์€ k+1 k k-1 โ€ฆ 1์„ ์ถœ๋ ฅํ•œ๋‹ค. ์ฆ‰ k+1๋ถ€ํ„ฐ 1๊นŒ์ง€ ์ถœ๋ ฅํ•œ๋‹ค

์ด๊ฑธ ๋ณด์ด๋Š” ๊ฑด func1(k+1)์ด ํ˜ธ์ถœ๋  ๋•Œ ์–ด๋–ค ์ƒํ™ฉ์ด ์ƒ๊ธฐ๋Š”๊ฐ€๋ฅผ ๋ณด๋ฉด ๋˜๋Š”๋ฐ
k+1์ด ์ถœ๋ ฅ๋œ ์ดํ›„ func1(k)๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ  func1(k)๋Š” k๋ถ€ํ„ฐ 1๊นŒ์ง€ ์ฐจ๋ก€๋กœ ์ถœ๋ ฅํ•œ๋‹ค ๊ฐ€์ •์„ ํ–ˆ์œผ๋‹ˆ
func1(k+1)์€ k+1๋ถ€ํ„ฐ 1๊นŒ์ง€ ์ฐจ๋ก€๋Œ€๋กœ ์ถœ๋ ฅํ•จ์„ ์•Œ ์ˆ˜ ์žˆ๊ฒ ์ฃ 

์ด ๋ฌธ์žฅ์ด ์ฐธ์ด๋ฏ€๋กœ ๊ท€๋‚ฉ์ ์œผ๋กœ func1 ํ•จ์ˆ˜๊ฐ€ n๋ถ€ํ„ฐ 1๊นŒ์ง€ ์ฐจ๋ก€๋กœ ์ถœ๋ ฅํ•˜๋Š” ํ•จ์ˆ˜์ž„์„ ์•Œ ์ˆ˜ ์žˆ๊ฒŒ ๋ผ์š”

์žฌ๊ท€ํ•จ์ˆ˜์˜ ์กฐ๊ฑด

ํŠน์ • ์ž…๋ ฅ์— ๋Œ€ํ•ด์„œ๋Š” ์ž๊ธฐ ์ž์‹ ์„ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  ์ข…๋ฃŒ๋˜์–ด์•ผ ํ•จ Base Condition/Base Case
๋ชจ๋“  ์ž…๋ ฅ์€ base Condition์œผ๋กœ ์ˆ˜๋ ดํ•ด์•ผ ํ•จ

์žฌ๊ท€์— ๋Œ€ํ•œ ์ •๋ณด

  • ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์–ด๋–ค ๊ฒƒ์„ ๋ฐ›๊ณ  ์–ด๋””๊นŒ์ง€ ๊ณ„์‚ฐํ•œ ํ›„ ์ž๊ธฐ ์ž์‹ ์—๊ฒŒ ๋„˜๊ฒจ์ค„์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •ํ•ด์•ผ ํ•จ
  • ๋ชจ๋“  ์žฌ๊ท€ ํ•จ์ˆ˜๋Š” ๋ฐ˜๋ณต๋ฌธ๋งŒ์œผ๋กœ ๋™์ผํ•œ ๋™์ž‘์„ ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ
  • ์žฌ๊ท€๋Š” ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๊ตฌํ˜„ํ–ˆ์„ ๋Œ€์— ๋น„ํ•ด ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•˜์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ/์‹œ๊ฐ„์—์„œ๋Š” ์†ํ•ด๋ฅผ ๋ด„
  • ํ•œ ํ•จ์ˆ˜๊ฐ€ ์ž๊ธฐ ์ž์‹ ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋ฉด ๋น„ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ์Œ
    • ๋˜‘๊ฐ™์€ ์—ฐ์‚ฐ์„, ์ด๋ฏธ ๊ณ„์‚ฐํ•œ ๊ฐ’์„ ์—ฌ๋Ÿฌ ๋ฒˆ ๋‹ค์‹œ ํ•˜๊ฒŒ ๋˜๋Š”
    • ํ”ผ๋ณด๋‚˜์น˜, n๋ฒˆ์˜ ๋ง์…ˆ์„ ํ•  ๊ฒƒ ๊ฐ™์ง€๋งŒ, ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(1.618n), n์— ๋Œ€ํ•œ ์ง€์ˆ˜ํ•จ์ˆ˜ ๊ผด
    • ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ†ตํ•ด O(n)์— ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค
  • ์žฌ๊ท€ํ•จ์ˆ˜๊ฐ€ ์ž๊ธฐ ์ž์‹ ์„ ๋ถ€๋ฅผ ๋•Œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์—์„œ ์Šคํƒ ์˜์—ญ์— ๊ณ„์† ๋ˆ„์ ์ด ๋จ
    • ๋ฌธ์ œ์—์„œ์˜ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์ด ์žˆ๋Š”๋ฐ, ์ผ๋ถ€ ์ปดํŒŒ์ผ ํ™˜๊ฒฝ์—์„œ๋Š” ์Šคํƒ ์˜์—ญ์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ณ„๋„๋กœ ์ž‘๊ฒŒ ์ œํ•œ๋˜์–ด ์žˆ๊ธฐ๋„ ํ•œ๋‹ค
    • ์žฌ๊ท€๋กœ ํ’€์—ˆ์„ ๋•Œ ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ๊ฐ€ ๋˜๋ฉด, ์–ด์ฉ” ์ˆ˜ ์—†์ด ๋ฐ˜๋ชฉ๋ฌธ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ’€์–ด์•ผ ํ•œ๋‹ค
    • ์ฐธ๊ณ  : ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ์—๋Š” ์ง€์—ญ ๋ณ€์ˆ˜๋„ ๋“ค์–ด๊ฐ„๋‹ค
  • ๊ฑฐ๋“ญ์ œ๊ณฑ
    • ๋ชจ๋“ˆ๋Ÿฌ ์—ฐ์‚ฐ ab mod m
    • ๊ณฑํ•˜๋Š” ์ค‘๊ฐ„์ค‘๊ฐ„ ๊ณ„์† m์œผ๋กœ ๋‚˜๋ˆ ์„œ ๋‚˜๋จธ์ง€๋งŒ ์ฑ™๊ฒจ๊ฐ€๋ฉด ๋œ๋‹ค
    • 231241234 * 12412 * 234 ์˜ ์ผ์˜ ์ž๋ฆฌ๋ฅผ ๊ตฌํ•  ๋•Œ ์ฆ‰ 10์œผ๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋Š” ์ผ์˜ ์ž๋ฆฌ 4 * 2 * 4๋งŒ ๊ณฑํ•ด์„œ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๋‹ค
    • ๋ชจ๋“ˆ๋Ÿฌ ์—ฐ์‚ฐ์—์„œ๋Š” 10์ด ๊ทธ๋ƒฅ m์œผ๋กœ ๋ฐ”๋€ ๊ฒƒ
    • ab mod d๋ฅผ O(b)์— ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค
  • ๊ณฑ์…ˆ
    • b๊ฐ€ 21์–ต?
    • ํžŒํŠธ1 an * an = a2n
    • ํžŒํŠธ2 1258 โ‰ก 4(mod 67) -> 12116 โ‰ก 16(mod 67)
    • ์•„ ๊ท€๋‚ฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค
      • 1๋ฒˆ ๋„๋ฏธ๋…ธ๊ฐ€ ์“ฐ๋Ÿฌ์ง„๋‹ค
      • k๋ฒˆ ๋„๋ฏธ๋…ธ๊ฐ€ ์“ฐ๋Ÿฌ์ง€๋ฉด k+1๋ฒˆ ๋„๋ฏธ๋…ธ๋„ ์“ฐ๋Ÿฌ์ง„๋‹ค
      • _
      • 1์Šน์„ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค
      • k์Šน์„ ๊ณ„์‚ฐํ–ˆ์œผ๋ฉด 2k์Šน๊ณผ 2k+1์Šน๋„ O(1)์— ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค.
      • -> 2k์Šน๊ณผ 2k+1์Šน ๋ชจ๋‘ k์Šน์„ ๊ณ„์‚ฐํ–ˆ์œผ๋ฉด O(1)์— ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค
      • ๋‘ ๋ฌธ์žฅ์ด ์ฐธ์ด๊ธฐ ๋•Œ๋ฌธ์— a์˜ ์ž„์˜์˜ ์ง€์ˆ˜์Šน์„ ๊ท€๋‚ฉ์ ์œผ๋กœ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค
    • b๊ฐ€ ์ ˆ๋ฐ˜์”ฉ ๊นŽ์ด๊ธฐ ๋•Œ๋ฌธ์— O(log b)
  • ํ•˜๋…ธ์ด ํƒ‘ ์ด๋™ ์ˆœ์„œ
    • n-1๊ฐœ์˜ ์›ํŒ์„ ๊ธฐ๋‘ฅ1์—์„œ ๊ธฐ๋‘ฅ2๋กœ ์˜ฎ๊ธด๋‹ค
    • n๋ฒˆ ์›ํŒ์„ ๊ธฐ๋‘ฅ 1์—์„œ ๊ธฐ๋‘ฅ 3์œผ๋กœ ์˜ฎ๊ธด๋‹ค
    • n-1๊ฐœ์˜ ์›ํŒ์„ ๊ธฐ๋‘ฅ 2์—์„œ ๊ธฐ๋‘ฅ3์œผ๋กœ ์˜ฎ๊ธด๋‹ค
    • -> ์›ํŒ์ด n-1๊ฐœ์ผ๋•Œ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ์œผ๋ฉด ์›ํŒ์ด n๊ฐœ์ผ ๋•Œ์—๋„ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ๋‹ค
    • ์›ํŒ์ด 1๊ฐœ์ผ๋•Œ ์›ํŒ์„ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ณณ์œผ๋กœ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ๋‹ค
    • ์›ํŒ์ด k๊ฐœ์ผ๋•Œ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ์œผ๋ฉด ์›ํŒ์ด k+1๊ฐœ์ผ๋•Œ์—๋„ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ๋‹ค
      1. ํ•จ์ˆ˜์˜ ์ •์˜
      1. base condition
      1. ์žฌ๊ท€์‹


๐Ÿซง

์žฌ๊ท€
๋ฐ˜๋ณต๋ฌธ๊ณผ ๊ฐ™์€ ์ผ์„ ํ•  ์ˆ˜ ์žˆ๊ณ , ๋ฐ˜๋ณต๋ฌธ๋ณด๋‹ค ์ข€ ๋Š๋ฆฌ๊ณ (ํ•จ์ˆ˜ ํ˜ธ์ถœ), ๋” ํฌ์ง€๋งŒ(ํ˜ธ์ถœ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ), ๋” ๋ช…ํ™•ํ•จ
์„ฑ๋Šฅ์„ ์œ„ํ•ด์„œ๋ผ๋ฉด ๋ฐ˜๋ณต๋ฌธ, ๋Šฅ๋ฅ ์„ ์œ„ํ•ด์„œ๋ผ๋ฉด ์žฌ๊ท€๋ฅผ
์ ์žฌ์ ์†Œ์— ๋งž๊ฒŒ

๊ธฐ๋ณธ๋‹จ๊ณ„ base case : ์žฌ๊ท€ ํ•จ์ˆ˜๊ฐ€ ์ž๊ธฐ ์ž์‹ ์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ
์žฌ๊ท€๋‹จ๊ณ„ recursive case : ์žฌ๊ท€ ํ•จ์ˆ˜๊ฐ€ ์ž๊ธฐ ์ž์‹ ์„ ํ˜ธ์ถœ

@ ํ˜ธ์ถœ ์Šคํƒ
@ ๊ผฌ๋ฆฌ ์žฌ๊ท€ Tail Recursion


์ด ๊ธฐ์‚ฌ๋Š” ์ €์ž‘๊ถŒ์ž์˜ CC BY 4.0 ๋ผ์ด์„ผ์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.