카테고리 없음

재귀 호출

sck07013 2024. 9. 22. 14:04
  • 재귀 호출: 함수가 자기 자신을 다시 호출하는 기법
  • 기저 사례: 재귀 호출을 멈추는 조건
  • 재귀 사례: 함수가 자기 자신을 호출하여 문제를 더 작은 하위 문제로 분할하는 부분
  • 장점: 간결성, 문제 분할
  • 단점: 성능 문제, 중복 계산
#재귀 호출의 작동
def openBox() :
    print('종이 상자를 엽니다. ^^')
    openBox()

openBox()
종이 상자를 엽니다. ^^
종이 상자를 엽니다. ^^
...
종이 상자를 엽니다. ^^
종이 상자를 엽니다. ^^
종이 상자를 엽니다. ^^

 

#재귀 호출 함수(반환 조건 추가)
def openBox() :
    global count
    print('종이 상자를 엽니다. ^^')
    count -= 1
    if count == 0 :
        print('반지를 넣고 반환합니다.')
        return
    openBox()
    print('종이 상자를 닫습니다. ^^')
    
count = 5
openBox()
종이 상자를 엽니다. ^^
종이 상자를 엽니다. ^^
종이 상자를 엽니다. ^^
종이 상자를 엽니다. ^^
종이 상자를 엽니다. ^^
반지를 넣고 반환합니다.
종이 상자를 닫습니다. ^^
종이 상자를 닫습니다. ^^
종이 상자를 닫습니다. ^^
종이 상자를 닫습니다. ^^

 

#재귀 호출 이해
def addNumber(num) :
    if num <= 1 :
        return 1
    return num + addNumber(num - 1)

print(addNumber(10))
55

 

#재귀 호출 이해 : 팩토리얼 구하기
def factorial(num) :
    if num <= 1 :
        return 1
    return num * factorial(num - 1)

print(factorial(5))
120

 

#재귀 호출 연습 : 우주선 발사 카운트 다운
def countDown(n) :
    if n == 0 :
        print('발사')
    else :
        print(n)
        countDown(n - 1)

countDown(5)
5
4
3
2
1
발사

 

#재귀 호출 연습 : 별 찍기
def printStars(n) :
    if n > 0 :
        printStars(n - 1)
        print('*' * n)

printStars(5)
*
**
***
****
*****

 

#재귀 호출 연습 : 구구단
def gugu(dan, num) :
    print('%d * %d = %d' % (dan, num, dan * num))
    if num < 9 :
        gugu(dan, num + 1)

gugu(2, 1)
2 * 1 = 2
2 * 2 = 4
2 * 3 = 6
2 * 4 = 8
2 * 5 = 10
2 * 6 = 12
2 * 7 = 14
2 * 8 = 16
2 * 9 = 18

 

# n제곱 계산하기
tab = ' '
def pow(x, n) :
    global tab
    tab += '  '
    if n == 0 :
        return 1
    print(tab + '%d * %d ^ (%d - %d)' % (x, x, n, 1))
    return x * pow(x, n - 1)

print('2 ^ 4')
print('답 ->', pow(2, 4))
2 ^ 4
   2 * 2 ^ (4 - 1)
     2 * 2 ^ (3 - 1)
       2 * 2 ^ (2 - 1)
         2 * 2 ^ (1 - 1)
답 -> 16

 

#배열의 합 계산
import random

def arySum(arr, n) :
    if n <= 0 :
        return arr[0]
    return arySum(arr, n - 1) + arr[n]

ary = [random.randint(0, 255) for _ in range(random.randint(10, 20))]
print(ary)
print('배열 합계 -->', arySum(ary, len(ary) - 1))
[65, 101, 76, 24, 200, 28, 7, 92, 255, 233]
배열 합계 --> 1081
Selection deleted

 

#피보나치 수
def fibo(n) :
    if n == 0 :
        return 0
    elif n == 1 :
        return 1
    else :
        return fibo(n-1) + fibo(n-2)

print('피보나치 수 --> 0 1', end = ' ')
for i in range(2, 20) :
    print(fibo(i), end = ' ')
피보나치 수 --> 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181