Python의 재귀에 대해 알아야 할 모든 것



이 기사는 Python의 재귀에 대한 상세하고 포괄적 인 지식을 얻는 데 도움이됩니다. 어떻게 작동합니까? 그 목적은 무엇입니까?

간단히 말해서 재귀는 함수 자체를 호출하여 문제를 해결하는 방법입니다. 재귀 ”는 라틴어 동사“ 되풀이하다 ”, 다시 실행하는 것을 의미합니다. 이것은 재귀 함수가하는 일이며, 같은 일을 반복해서 다시 실행합니다. 이 기사에서는 파이썬의 재귀에 대해 배웁니다. 이 블로그에서 다루는 주제는 다음과 같습니다.

파이썬에서 재귀 란 무엇입니까?

재귀는 그 자체로 무언가를 결정하는 과정입니다. 우리는 파이썬에서 모든 함수가 다른 함수를 호출 할 수 있고 함수가 자신을 호출 할 수도 있다는 것을 알고 있습니다. 특정 조건이 충족되지 않을 때까지 자신을 호출하는 이러한 유형의 함수를 재귀 함수라고합니다.





Recursion-in-Python

어떻게 작동하는지 몇 가지 예를 들어 보겠습니다. 양의 정수 n이 주어지면 계승이됩니다.



  • 엔! = n * (n-1) * (n-2) 등등.
  • 2! = 2 * (2-1)
  • 하나! = 1
  • 0! = 0
  • 4! = 4 * 3!
  • 삼! = 3 * 2!
  • 2! = 2 * 1!

위의 값을 바꾸면 다음 표현식이 생성됩니다.

Power BI에서 대시 보드를 만드는 방법
  • 4! = 4 * 3 * 2 * 1

함수를 정의해야합니다. fact (n)이 매개 변수로 양의 정수 또는 0을 취하고 n 번째 팩토리얼을 반환합니다. 재귀를 사용하여 어떻게 할 수 있습니까?

재귀를 사용하여 그렇게하려면 다음 방정식을 조사해야합니다.



  • 엔! = n. (n-1). (n-2) & hellip3.2.1

  • 엔! = n. (n-1)! # 위 문장을이 줄에 다시 쓸 수 있습니다.

  • 이제 여기에서 2를 매개 변수로 전달하면 다음과 같은 결과를 얻을 수 있습니다.

    • 2! = 2.1! = 2

  • 마찬가지로 1을 통과하면 다음을 얻게됩니다.

    • 하나! = 1.0! = 1

  • 하지만 우리가 0을 통과하면

    • 0! = 0. (-1)! 여기서 -1에 대한 계승은 정의되지 않았으므로 값> 0에 대해서만 작동합니다.

  • 그래서 우리는 두 가지 케이스를 작성해야합니다

    • 1. n! = n. (n-1)! n> = 1 인 경우

    • 2. n = 0 인 경우 1

이것은 모든 양의 정수와 0에 대한 완전한 솔루션입니다.

종료 조건

재귀 함수는 종료하려면 중요한 조건을 충족해야합니다. 추가 재귀없이 문제를 해결할 수있는 조건으로 이동하면 재귀 함수가 종료되어 문제가 더 작은 하위 단계로 최소화됩니다. 호출에서 종료 조건이 충족되지 않으면 재귀가 무한 루프로 끝날 수 있습니다.

팩토리얼 조건 :

  • n이 1보다 크면 n = n * (n-1)의 계승입니다.
  • n = 0 인 경우 1

위의 계승 조건을 파이썬 코드로 변환합니다.

def fact (n) : if n == 1 : return n else : return n * fact (n-1)

예를 들어 4의 계승을 찾고 싶다고합시다.

fact (4) #n == 1이 될 때까지 4 * fact (3) 등을 반환합니다.
 산출: 24

단순성과 명확성으로 인해 재귀의 예로 자주 사용됩니다. 컴퓨터 과학에서 재귀라고하는 각 단계에서 문제의 작은 사례를 해결합니다.

Python의 재귀 제한

일부 언어에서는 무한 재귀 루프를 만들 수 있지만 Python에서는 재귀 제한이 있습니다. 제한을 확인하려면 sys 모듈에서 다음 기능을 실행하십시오. 파이썬에 설정된 재귀의 한계를 제공합니다.

명령 줄에서 하이브 쿼리 실행
import sys sys.getrecursionlimit ()
 산출: 1000

필요에 따라 sys 모듈의 functionsetrecursionlimit ()를 사용하여 제한을 변경할 수도 있습니다. 이제 제한을 초과 할 때까지 자신을 재귀 적으로 호출하고 어떤 일이 발생하는지 확인하는 함수를 만들어 보겠습니다.

def recursive () : recursive () if __name__ == '__main__': recursive ()

위 코드를 실행하면 런타임 예외가 발생합니다. RuntimeError : maximum recursion depth exceeded. 파이썬은 끝나지 않는 재귀 루프로 끝나는 함수를 만들지 못하게합니다.

재귀를 사용하여 목록 병합

팩토리얼을 제외하고 재귀를 사용하여 수행 할 수있는 다른 작업, 중첩 된 목록에서 단일을 만들고 싶다고 가정 해 보겠습니다. 아래 코드를 사용하여 수행 할 수 있습니다.

def flatten (a_list, flat_list = none) : flat_list가없는 경우 : flat_list = [] for item in a_list : if isinstance (item, list) : flatten (item, flat_list) else : flat_list.append (item) return flat_list if __name__ == '__main__': 중첩 = [1,2,3, [4,5], 6] x = flatten (nested) print (x)
 산출: [1,2,3,4,5,6]

위의 코드를 실행하면 입력으로 사용한 정수 목록이 포함 된 정수 목록 대신 단일 목록이 생성됩니다. 다른 방법을 사용하여 같은 일을 할 수도 있습니다. 파이썬에는 itertools.chain ()이라는 것이 있습니다. 함수 chain ()을 만드는 데 사용 된 코드를 확인할 수 있습니다. 우리가했던 것과 같은 작업을 수행하는 다른 접근 방식입니다.

재귀의 장점

  • 재귀 함수에서 코드는 깨끗하고 우아합니다.

  • 복합 작업은 재귀를 사용하여 더 간단한 하위 문제로 나눌 수 있습니다.

  • 일부 중첩 된 반복을 사용하는 것보다 재귀를 사용하여 시퀀스를 생성하는 것이 더 쉽습니다.

재귀의 단점

  • 재귀 함수의 논리를 따르는 것은 때때로 어려울 수 있습니다.

  • 재귀 호출은 많은 메모리와 시간을 차지하므로 비용이 많이 듭니다 (비효율적).

  • 재귀 함수는 디버그하기 어렵습니다.

이 기사에서 우리는 재귀가 무엇인지, 문제 설명에서 재귀 함수를 개발하는 방법, 수학적으로 문제 설명을 정의하는 방법을 살펴 보았습니다. 우리는 팩토리얼의 문제를 해결하고 팩토리얼을 찾는 데 필요한 조건을 찾아내어 그 조건을 파이썬 코드로 변환하여 재귀가 어떻게 작동하는지 이해할 수 있도록했습니다. 개발자가 잘못 구성된 재귀 함수를 만드는 것을 방지하기 위해 Python에 재귀 제한이 내장되어 있다는 것이 깔끔하다고 생각합니다. 주목해야 할 한 가지 중요한 점은 함수가 계속 자신을 호출하기 때문에 재귀를 디버그하기 어렵다는 것입니다.