python의 꼬리 귀속🐍

귀속 호출이 함수가 실행하는 마지막 일 (즉 함수가 자신에 대한 호출로 되돌아오는 것) 일 때, 귀속 함수는 꼬리에서 귀속된다.

왜 꼬리 귀착에 관심을 가져야 합니까?🤔


꼬리 귀속 함수는 원시 함수보다 더 좋다고 여겨진다. 왜냐하면 꼬리 귀속은 컴파일러를 통해 최적화할 수 있기 때문이다.
이 생각은 매우 간단하다. 귀속 호출이 마지막 문장이기 때문에 현재 함수에 할 일이 없기 때문에 현재 함수의 창고 프레임을 저장하는 것은 소용이 없기 때문에 메모리 창고에 지금까지 저장된 모든 내용을 버렸다.
대부분의 프로그래밍 언어는 꼬리 부분에 귀속되어 있는데, 이것은 그들이 자신의 호출 결과를 되돌려주는 함수를 최적화할 수 있다는 것을 의미한다
거의 모든 귀속 함수는 끝부분 호출 형식으로 변환할 수 있다.다음은 함수 예제입니다.
먼저 원시적인 형식으로 전환한 다음에 끝부분 호출 형식으로 전환한다.
# Original Function
def function(n):
    if n == 0: 
        return 1
    return factorial(n-1) * n

# Tail recursive function
def function(n, var=1):
    if n == 0: 
        return var
    return factorial(n-1, var * n)
🧐그것들은 모두 비슷해 보이지만, 사실상 원시적으로 보기에는 더욱 간단하고, 꼬리 호출 형식인 것 같지만, 만약 당신이 그것을 관찰한다면, 곱셈은 귀속 호출 외에 최적화할 수 없다는 것을 발견할 수 있을 것이다.
🔑둘 사이의 관건적인 차이점은 비꼬리 함수에서 CPU는 우리가 곱셈할 숫자를 추적해야 한다는 것이다. 꼬리 함수에서 CPU는 남은 유일한 작업이 다른 함수 호출이라는 것을 알고 현재 함수에 사용되는 모든 변수와 상태를 제거할 수 있다
이것은 듣기에는 괜찮지만, "Python은 끝부분 호출 최적화를 지원하지 않습니다."라는 문제가 여전히 존재한다.🤷‍♀️
사람들은 꼬리가 파이썬에 귀속되는 것을 나쁜 방법으로 여긴다.이것은 거의 아무런 이유가 없다. 가장 간단한 원인은python이 귀속적인 사상이 아니라 교체된 사상을 중심으로 구축된 것이다.
그런데 진짜 문제는 우리가 할 수 있을까?🤔
요컨대 답은 부정적이다.그러나 우리는 수동으로 귀속을 제거할 수 있다. 우리는 다음 절에서 볼 수 있다.

python 끝부분을 귀속시키다🤯


귀속 꼬리 호출은 점프로 대체할 수 있다.이것은'꼬리 호출 제거'라고 불리며 귀속 함수 사용을 제한하는 데 도움이 되는 최대 창고 깊이의 변환으로 창고 프레임을 분배하지 않아도 메모리를 줄일 수 있다는 장점이 있다.
때때로 창고가 넘쳐서 실행할 수 없는 귀속 함수는 같은 문제에 직면하지 않고 무한히 작업할 수 있는 함수로 변환된다.
# factorial.py
from tail_recursion import tail_recursive, recurse

# Normal recursion depth maxes out at ~1000, this one works indefinitely
@tail_recursive
def factorial(n, var=1):
    if n == 0:
        return var
    recurse(n-1, var=var*n)
함수 (이 예에서 곱하기) 가 @tail\urecursive로 수식될 때, 이것은 tail\u 호출 방법을 실현하는 대상을 되돌려줍니다.
만약 당신이 장식기가 무엇인지 모른다면, 당신은 지금 반드시 here 을 읽어야 한다. 기본적으로 그것들은 다른 함수에서 호출된 함수이며, 어떤 방식으로 행동을 바꾸어야 한다.

Note - decorators != annotations


손질 함수는 tail\ucall () 에 대한 호출을 반환하는지 테스트합니다.만약 그렇다면, 반환 값은 호출 창고로 전송되며, 호출 창고는 목록의 간단한 구현일 뿐입니다.
tail\ucall은 호출된 함수 (예를 들어 곱하기) 와 호출된 (키워드) 인자 (예를 들어 n-1) 를 저장하는 대상을 되돌려줍니다.만약 매개 변수가tail\u 호출에 대한 플러그인 호출을 포함한다면, 이 호출도 호출 창고로 전송됩니다.
다른 한편, 플러그인tail\u 호출이 전달되지 않으면 저장된 (키워드) 파라미터를 사용하여 저장된 함수를 호출합니다.그리고 이 지연 호출의 반환값
  • 또는
  • 전달 매개 변수로 교체
  • 다른 덤프에 전송된tail_호출을 되돌려주거나, (c) 수식 함수에 대한 호출의 최종 되돌려주기 값(예를 들어 곱하기 (x)이다.
  • 결론⛳



    여기서 우리는 꼬리 귀속 함수가 무엇인지 보았습니다 & 어떻게tail\u 귀속 수식자를 사용하여 꼬리 귀속 함수를 간단하게 정의하여Python이 꼬리 호출을 없애도록 했습니다.
    Python은 몇 개의 귀속 호출을 할 수 있는지에 대해 아주 작은 제한을 가지고 있다.이 제한의 원인은 귀속 호출을 실행하려면 대량의 메모리와 자원이 필요하기 때문이다. 왜냐하면 호출 창고의 모든 프레임은 호출이 끝날 때까지 지속적이어야 하기 때문이다.
    장식기는 진입과 퇴출을 통해 이 문제를 해결하는 데 사용되기 때문에 기술적으로 말하자면, 우리의 함수는 사실상 더 이상 귀속되지 않기 때문에 우리는 제한을 피했다.
    또한 꼬리 귀속의 장점도 보았다. 최대 귀속 깊이 오류나 메모리 부족 붕괴가 발생하면 꼬리 귀속이 유용한 전략이 될 수 있다.
    뭐 공부 해요?🤞! 즐거움 코드

    만약 네가 이곳에서 읽은 내용을 좋아하고 지지를 표시하고 싶다면, 나에게 커피를 좀 사주는 것을 고려해 봐도 된다☕


    좋은 웹페이지 즐겨찾기