Python/파이썬 기초

파이썬 return 값 여러개 설정하기, 재귀 함수 응용 예시

jimmy_AI 2022. 1. 3. 14:40
반응형

파이썬 return 반환 값 여러개 설정 + 재귀 함수

안녕하세요. 이번 시간에는 파이썬 함수에서 return 값을 여러개 설정하는 방법과

return의 성질을 이용한 재귀 함수의 예시를 살펴보겠습니다.

 

파이썬 return 여러개 예시(feat. 튜플)

예를 들어, 두 수를 input으로 받고, 해당 숫자들의 합과 곱을 동시에 반환 받는

경우의 예시를 살펴보겠습니다.

def sum_and_mul(a, b):
    return a + b, a * b # 쉼표로 반환 값 구분

hap, gop = sum_and_mul(3, 5)
print(hap) # 8
print(gop) # 15

위와 같이 쉼표(,)를 기준으로 반환 값 사이를 구분해주시면 간단하게 해결됩니다.

두 반환 값을 각각 hap, gop 이라는 변수에 동시에 반환하여 값을 확인해 보았습니다.

 

return 값을 여러개 받을 수 있는 원리는 튜플의 성질을 이용한 것인데요.

위의 함수 구현은 사실은 아래의 형태와 완전히 동일하다고 볼 수 있습니다.

def sum_and_mul2(a, b):
    return (a + b, a * b) # 튜플 형태 output

sum_and_mul(3, 5) # (8, 15)
sum_and_mul2(3, 5) # (8, 15)

위에서 구현한 함수도 사실은 (8, 15)라는 2개의 값을 가진 튜플을 반환 값으로

가져오고 있다는 점을 확인해볼 수 있었습니다.

 

그래서 여러 개 변수에 반환 값을 나눠 받는 것도 packing이 가능한 튜플의 성질

인하여 가능한 것이지요.

 

이 원리를 통하여 3개 이상의 반환 값도 마찬가지로 얼마든지 구현이 가능합니다.

 

 

파이썬 재귀 함수 예시

return으로 자기 자신의 함수를 다시 호출하여 값을 가져오는 것이 가능합니다.

이 형태를 재귀 함수라고 하는데, 가장 대표적인 예제인 피보나치 수열을 보겠습니다.

 

피보나치 수열은 1,1,2,3,5,8,13 처럼 앞의 두개의 수를 더하여 다음 숫자를 만드는

간단한 원리로 이루어진 수열입니다.

def fibonacci(n):
    if n == 0 or n == 1: # 초기값 설정
        return 1
    else:
        return fibonacci(n-1) + fibonacci(n-2) # 재귀 호출

print(fibonacci(5)) # 8
print(fibonacci(10)) # 89

fibonacci 함수 내에서 fibonacci 함수를 다시 호출하면서 재귀 호출을 하는

것을 return을 이용하여 구현해볼 수 있었습니다.

반응형

파이썬 재귀 함수 주의 사항

재귀 함수를 이용할 때, 주의해야 할 사항은 호출의 횟수가 너무 많아지면,

실행 시간이 지나치게 오래 걸리거나, 메모리 제한에 걸려 계산이 불가능해질 수 있습니다.

 

위에서 구현한 피보나치 수열은 실제로 n이 1씩 커질 때 마다,

계산 횟수가 지수적으로 증가하는 원리를 가지고 있습니다.

fibonacci(40)을 계산해야한다면, 계산 원리는 아래와 같이 표현이 가능합니다.

같은 호출 형태가 지속적으로 반복되면서 호출 횟수가 지나치게 많아지는

현상이 일어남을 관찰할 수 있었습니다.

 

이런 경우는 다이나믹 프로그래밍을 활용하는 등의 방법으로 개선이 가능한데,

이에 대한 내용은 여기서는 논의를 생략하도록 하겠습니다.

 

두 번째 주의사항은 종료 조건의 초기 값을 제대로 설정해주지 않는다면,

함수가 무한 루프에 빠질 수도 있다는 점입니다.

예를 들어 아래 함수와 같은 경우는 무한 루프에 빠지는 예시입니다.

def hello():
    print('안녕하세요!')
    hello() # 자기 자신 호출, 무한 루프에 빠짐

# 안녕하세요! 가 무한히 출력됨.
hello()

hello() 내부 에서 hello()가 또 실행되고, 실행된 hello()에서 또 hello()가

실행되고, ...하는 식으로 안녕하세요! 라는 메시지가 무한히 출력되는

현상을 관찰하실 수 있을 것입니다.

 

이와 같이 재귀 함수를 설정할 때에는 종료 조건이 잘 구현되었는지를

반드시 확인해야만 합니다.