TIL - Python - 재귀호출

김영훈·2021년 2월 24일
0

Python

목록 보기
7/14

# 재귀호출

  • 재귀호출이란?

    • 재귀호출(recrusive call)이란 함수가 자기 자신을 호출하는 것을 의미한다. 언어적 의미만으로 이해하기엔 상당히 복잡한 개념이기 때문에, 아래의 예시를 통해 재귀호출의 정확한 의미에 대해 파악해보기로 한다.
  • 재귀호출의 예시

    def hello(): 
        print('Hello, world!')
        hello()
           
        return
    hello()    
           #  hello 함수를 실행 : Hello, world!
                                Hello, world!
                                Hello, world!
                                    .
                                    .
                                    .
                                RecursionError: maximum recursion depth exceeded while calling a Python object
    • 위 예시에서 hello함수는 함수 내부에서 hello()라는 코드를 통해 자기 자신을 호출하고 있다. hello함수가 실행될 때마다, 같은 함수(자기 자신)가 호출되는 것이다. 이러한 함수의 반복 호출은 print()를 통해 출력되는 문자열을 통해서도 확인 가능하다. 함수가 실행되면, print('Hello, world!') 명령이 반복되면서 문자열이 반복 출력된다.

    • 문자열의 반복 출력이 도중에 멈춘 뒤 error가 발생하는 이유는 파이썬의 최대 재귀 깊이(maximum recursion depth)가 1,000으로 정해져 있기 때문이다.

  • 재귀호출의 종료 조건 만들기

    • 그렇다면, 재귀호출의 error 발생을 막을 순 없을까? 방법은 의외로 간단하다. 함수의 반복 호출을 종료시킬 수 있는 조건을 만들어 코드의 흐름을 제어하는 것이다.

      def hello(count):          # 함수의 호출 횟수를 인수로 받는 매개변수 count를 추가
      
          if count == 0:         # 변수 count의 값이 0일 경우에 대한 조건을 설정
              return             # return을 통해 함수를 빠져나가게 되면서 재귀 호출이 종료된다.
      
          print('Hello, world!')
          count -= 1             # 함수의 호출이 1회 이뤄질 때마다 변수 count의 값에 변화를 주는 변화식 추가
          hello(count)
      
      hello(5)
    • 위 함수를 실행할 경우, print(Hello, world!)가 5회 실행됨에 따라 문자열 'Hello, word!'가 5회 출력된 후, return에 의해 함수 실행이 종료된다.

  • 재귀호출로 팩토리얼 구하기

    • 재귀호출을 응용하여 팩토리얼을 구현할 수 있다. 팩토리얼의 정의는 아래 설명을 참고하도록 하자.

      팩토리얼은 1부터 n까지 양의 정수를 차례대로 곱한 값이며 !(느낌표) 기호로 표기합니다. 예를 들어 5!은 5 * 4 * 3 * 2 * 1이며 결과는 120입니다.

    • 재귀호출로 구현한 팩토리얼은 살펴보자.

      def factorial(count):
      
          if count == 1:
              return 1    # count가 1인 경우, 결괏값으로 1을 반환
      
          return count*factorial(count-1)   # 인수로 받은 변수 count의 값 * factorial(count-1)의 결괏값
      
      print(factorial(5))   #  결괏값 출력을 위해 print() 사용 
                            #  결괏값 : 120
      
    • 개인적인 단상을 정리하면

      • 함수의 결괏값return을 통해 반환된 값이다.

      • return으로 함수 객체(factorial(count-1))를 반환할 수도 있다. 이러한 경우, 함수 객체가 호출(실행)된다.

profile
Difference & Repetition

0개의 댓글