기록하는 중/파이썬

[Python] 재귀 함수

성장하는 요롱이 2024. 5. 4. 18:07
  재귀 함수
  • 재귀 : 자기 자신을 호출하는 것
  • 재귀 함수를 사용하여 팩토리얼을 구할 수 있음
f(3) = 3 * f(2)
      = 3 * 2 * f(1) * f(0) -> f(0)은 1임
      = 3 * 2 * 1 * 1
# 재귀 함수로 팩토리얼을 구하기
def factorial(n):
    # n이 0이라면 1을 리턴
    if n == 0:
        return 1
    # n이 0이 아니라면 n * (n - 1)을 리턴
    else:
        return n * factorial(n-1)
    
print("1! : ", factorial(1) )
print("2! : ", factorial(2) )
print("3! : ", factorial(3) )
print("4! : ", factorial(4) )
print("5! : ", factorial(5) )

 

  재귀 함수의 문제
  • 상황에 따라 기하급수적으로 많이 반복함
  • 시간이 오래 걸리는 상황이 발생

 

  재귀 함수의 문제 해결
  • 메모화 : 딕셔너리를 사용해서 한 번 계산한 값을 메모(저장)하여 반복 수행하지 않고 곧바로 값을 돌려 줌으로써 코드의 속도를 빠르게 함
dictionary = {
    1: 1,
    2: 1
}

# 피보나치 수열 : 첫째 둘째항이 1이며 그 뒤에 모든 항은 바로 앞 두 항의 합인 수열

def fibonacci(n):
    if n in dictionary:
        # 메모가 되어 있으면 메모된 값을 리턴
        return dictionary[n]
    else :
        # 메모가 되어 있지 않으면 값을 구함
        output = fibonacci(n - 1) + fibonacci(n - 2)
        dictionary[n] = output
        return output

print("fibonacci(10):", fibonacci(10))
print("fibonacci(20):", fibonacci(20))
print("fibonacci(30):", fibonacci(30))
print("fibonacci(40):", fibonacci(40))
print("fibonacci(50):", fibonacci(50))
  • 조기 리턴 : 코드 중간에 return 키워드를 사용하는 것
def fibonacci(n):
    if n in dictionary:
        # 메모되어 있으면 메모된 값 리턴
        return dictionary[n]
        
    # 메모되어 있지 않으면 값을 구함
    output = fibonacci(n-1) + fibonacci(n - 2)
    dictionary[n] = output
    return output
    
    
print("fibonacci(10):", fibonacci(10))
print("fibonacci(20):", fibonacci(20))
print("fibonacci(30):", fibonacci(30))
print("fibonacci(40):", fibonacci(40))
print("fibonacci(50):", fibonacci(50))