[์ž๋ฃŒ๊ตฌ์กฐ] ์žฌ๊ท€(Recursion)

2022. 3. 10. 15:59

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


์žฌ๊ท€ํ•จ์ˆ˜๋ž€ ์–ด๋–ค ํ•จ์ˆ˜ func(n)์ด ์žˆ๋‹ค๊ณ  ํ•  ๋•Œ, ์ด ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์ž๊ธฐ ์ž์‹ ์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

 

1) ์žฌ๊ท€ํ•จ์ˆ˜์˜ ํŠน์ง•


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

  1. ์ž๊ธฐ ์ž์‹ ์„ ํ˜ธ์ถœํ•˜๋Š” ๋ถ€๋ถ„
  2. ์ผ์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฉด ํ˜ธ์ถœ์„ ์ •์ง€ํ•˜๊ณ  ์–ด๋–ค ๊ฐ’์„ returnํ•˜๋Š” ๋ถ€๋ถ„

์ด ๋‘ ๋ถ„์œผ๋กœ ๋‚˜๋‰˜์–ด์ง„๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํ•จ์ˆ˜ ํ˜ธ์ถœ์€ ๋ฉ”๋ชจ๋ฆฌ์˜ ์Šคํƒ ์˜์—ญ์— ์Œ“์ด๊ฒŒ ๋˜๋Š”๋ฐ, ์Šคํƒ์€ ํ›„์ž…์„ ์ถœ(LIFO)๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ž„์„ ์šฐ๋ฆฌ๋Š” ์•Œ๊ณ  ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ, ์•„๋ž˜ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ์Šคํƒ ์˜์—ญ์— ์Œ“์ด๋Š” ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

def sol(n):

	if n == 5:
		return

	else:
		return sol(n+1)

sol(0)

๐Ÿ‘‰ ์žฌ๊ท€ํ•จ์ˆ˜ ํ˜ธ์ถœ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์Šคํƒ์ด ์ƒ๊ธด๋‹ค.๐Ÿ‘‰ ์žฌ๊ท€ ํ•จ์ˆ˜์˜ ๋‹จ์ ์€ n์ด ์ฆ๊ฐ€ํ•˜๋ฉด ์‹œ๊ฐ„ ๋ณต์žก๋„ O(2n)๊ฐ€ ๊ฐ€ํŒŒ๋ฅด๊ฒŒ ์ฆ๊ฐ€ํ•œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. (→ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ”๋ชจ์ด์ œ์ด์…˜(Memoization)์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)โ€ผ๏ธ ์žฌ๊ท€ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ์ž…๋ ฅ(์ธ์ž)๊ฐ’์ด ํŠน์ • ํŒจํ„ด์„ ๋ฐ˜๋ณตํ•˜๊ฑฐ๋‚˜, ๋ณ€ํ™”๊ฐ€ ์—†์œผ๋ฉด ๋ฌดํ•œํžˆ ๋ฐ˜๋ณตํ•˜๊ฒŒ ๋œ๋‹ค. โ–ถ์žฌ๊ท€ํ•จ์ˆ˜ ์„ค๊ณ„ ์‹œ ์ž…๋ ฅ ๊ฐ’์ด ์ข…๋ฃŒ ์กฐ๊ฑด์œผ๋กœ ์ˆ˜๋ ดํ•˜๋Š”์ง€ ๊ผญ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

 

2) ์žฌ๊ท€ํ•จ์ˆ˜ ์งœ๋Š” ๋ฒ•


1.  ์ž์‹ ์„ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์„ ์ •์ง€์‹œํ‚ค๋Š” ์กฐ๊ฑด์„ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

  1. ํ•œ ๋™์ž‘๋งˆ๋‹ค ํ•ด์•ผํ•˜๋Š” ๊ฒƒ๋“ค์„ ์ •์˜ํ•ด์„œ, ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์จ๋„ฃ๋Š”๋‹ค.
  2. ๋‹ค์Œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ, ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์–ด๋–ค ๊ฒƒ๋“ค์„ ๋„˜๊ฒจ์ค˜์•ผ ํ•  ์ง€ ์ •ํ•ด์•ผ ํ•œ๋‹ค.

 

์žฌ๊ท€ํ•จ์ˆ˜์˜ ์˜ˆ์‹œ


1. ํŒฉํ† ๋ฆฌ์–ผ

def factorial(n):
    if n == 1:      # n์ด 1์ผ ๋•Œ
        return 1    # 1์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์žฌ๊ท€ํ˜ธ์ถœ์„ ๋๋ƒ„
    return n * factorial(n - 1)    # n๊ณผ (factorial ํ•จ์ˆ˜์— n-1์„ ๋„ฃ์–ด์„œ ๋ฐ˜ํ™˜๋œ ๊ฐ’)์„ ๊ณฑํ•จ

 

2. ๊ฑฐ๋“ญ์ œ๊ณฑ

def solution2(x,n):
	if n == 0:
		return x
	else:
		return x * solution2(x,n-1)

 

3. ํ”ผ๋ณด๋‚˜์น˜์ˆ˜์—ด

  • ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜ : ์ฒซ๋ฒˆ์งธ์™€ ๋‘๋ฒˆ์งธ ๊ฐ’์ด 1์ด๊ณ  ๋‹ค์Œ๋ถ€ํ„ฐ๋Š” ๊ทธ ์ „์˜ ์ˆ˜์™€ ๊ทธ ์ „์ „์˜ ์ˆ˜๋ฅผ ๋”ํ•˜๋Š” ๋ฐฉ์‹

์ฒซ ๋ฒˆ์งธ ๊ฐ’์ด 0์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์œผ๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ์˜ ์ˆ˜์—ด์ด๋‹ค.

                                                       (0), 1, 1, 2, 3, 5, 8, 13, ...
def fib(n):

	if n == 0:
		return 0

	elif n == 1 or n == 2:
		return 1

	else:
		return fib(n - 1) + fib(n - 2)

 

4. ํ•˜๋…ธ์ด์˜ ํƒ‘

ํ•˜๋…ธ์ด์˜ ํƒ‘ ๋ฌธ์ œ๋Š” ์žฌ๊ท€ ํ˜ธ์ถœ์„ ์ด์šฉํ•˜์—ฌ ํ’€ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์œ ๋ช…ํ•œ ์˜ˆ์ œ ์ค‘์˜ ํ•˜๋‚˜์ด๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ˆ˜์—…์—์„œ ์žฌ๊ท€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์˜ˆ์ œ๋กœ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.

# ์ž…๋ ฅ : ์˜ฎ๊ธฐ๋ ค๋Š” ์›๋ฐ˜์˜ ๊ฐœ์ˆ˜ n
# ์˜ฎ๊ธธ ์›๋ฐ˜์ด ํ˜„์žฌ ์žˆ๋Š” ์ถœ๋ฐœ์  ๊ธฐ๋‘ฅ from_pos
# ์›๋ฐ˜์„ ์˜ฎ๊ธธ ๋„์ฐฉ์  ๊ธฐ๋‘ฅ to_pos
# ์˜ฎ๊ธฐ๋Š” ๊ณผ์ •์—์„œ ์‚ฌ์šฉํ•  ๋ณด์กฐ ๊ธฐ๋‘ฅ aux_pos
# ์ถœ๋ ฅ : ์›๋ฐ˜์„ ์˜ฎ๊ธฐ๋Š” ์ˆœ์„œ

def hanoi(n, from_pos, to_pos, aux_pos):

	if n == 1 :         # ์›๋ฐ˜ ํ•œ ๊ฐœ๋ฅผ ์˜ฎ๊ธฐ๋Š” ๋ฌธ์ œ๋ฉด ๊ทธ๋ƒฅ ์˜ฎ๊ธฐ๋ฉด ๋จ
		print(from_pos, '->', to_pos)
		return

	hanoi(n - 1, from_pos, aux_pos, to_pos)   	# ์›๋ฐ˜ n-1๊ฐœ๋ฅผ aux_pos๋กœ ์ด๋™(to_pos๋ฅผ ๋ณด์กฐ ๊ธฐ๋‘ฅ์œผ๋กœ)

	print(from_pos, '->', to_pos)     # ๊ฐ€์žฅ ํฐ ์›๋ฐ˜์„ ๋ชฉ์ ์ง€๋กœ ์ด๋™
	hanoi(n - 1, aux_pos, to_pos, from_pos)    	# aux_pos์— ์žˆ๋Š” ์›๋ฐ˜ n-1๊ฐœ๋ฅผ ๋ชฉ์ ์ง€๋กœ ์ด๋™ (from_pos๋ฅผ ๋ณด์กฐ ๊ธฐ๋‘ฅ์œผ๋กœ)
print('n = 1')
hanoi(1, 1, 3, 2) # ์›๋ฐ˜ ํ•œ ๊ฐœ๋ฅผ 1๋ฒˆ ๊ธฐ๋‘ฅ์—์„œ 3๋ฒˆ ๊ธฐ๋‘ฅ์œผ๋กœ ์ด๋™

n = 1

1 -> 3

print('n = 2')
hanoi(2, 1, 3, 2) # ์›๋ฐ˜ ํ•œ ๊ฐœ๋ฅผ 1๋ฒˆ ๊ธฐ๋‘ฅ์—์„œ 3๋ฒˆ ๊ธฐ๋‘ฅ์œผ๋กœ ์ด๋™

n = 2

1 -> 2

1 -> 3

1 -> 3

 

์ด ๋ฌธ์ œ์˜ ํ•ต์‹ฌ์€ 3๊ฐ€์ง€ ์›๊ธฐ๋‘ฅ์„ 1,2,3 ์ด๋ผ๊ณ  ์ •ํ•˜๋Š”๋ฐ ์ด ๋œป์€ ์‹œ์ž‘,๋ณด์กฐ,๋ชฉํ‘œ ๊ธฐ๋‘ฅ 3๊ฐ€์ง€์ด๋‹ค.

์ด ๊ธฐ๋‘ฅ ๋ฒˆํ˜ธ๋“ค์„ ํ†ตํ•ด์„œ ์›๋ฐ˜์ด ์–ด๋–ป๊ฒŒ ์ด๋™๋˜๋Š”์ง€๋ฅผ ๊ธฐ๋‘ฅ ๋ฒˆํ˜ธ๋กœ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ!

 

๐Ÿ’ก ํ•˜๋…ธ์ด์˜ ํƒ‘ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ•ต์‹ฌ 1. ์ œ์ผ ํฐ ์›๋ฐ˜์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ์›๋ฐ˜๋“ค์„ ๋ณด์กฐ ๊ธฐ๋‘ฅ์œผ๋กœ ๋ณด๋‚ธ๋‹ค๋Š” ๊ฒƒ (์žฌ๊ท€๋กœ ๊ตฌํ˜„) 2. ๊ทธ ๋‹ค์Œ ์‹œ์ž‘ ๊ธฐ๋‘ฅ์— ๋”ธ๋ž‘ ํ˜ผ์ž ์žˆ๋Š” ์ œ์ผ ํฐ ์›๋ฐ˜์ด ์ฒ˜์Œ์˜ ๋ชฉํ‘œ ๊ธฐ๋‘ฅ์œผ๋กœ ๊ฐ„๋‹ค๋Š” ๊ฒƒ (์ด๋Š” print๋กœ ๊ตฌํ˜„) 3. ๋ณด์กฐ ๊ธฐ๋‘ฅ์— ์žˆ๋Š” ์›๋ฐ˜๋“ค(n-1๊ฐœ์˜ ์›๋ฐ˜๋“ค)์„ ๊ทธ๋Œ€๋กœ ๋ชฉํ‘œ๊ธฐ๋‘ฅ์œผ๋กœ ๋ณด๋‚ด๋Š” ๊ฒƒ (๋‹ค์‹œ ์žฌ๊ท€๋กœ ๊ตฌํ˜„)

 

BELATED ARTICLES

more