python 함수 재 귀 꼬리 재 귀
2695 단어 python
http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00137473836826348026db722d9435483fa38c137b7e685000
#############################################
함수 내부 에서 다른 함 수 를 호출 할 수 있 습 니 다.만약 한 함수 가 내부 에서 자신 을 호출 한다 면, 이 함 수 는 재 귀 함수 이다.
단계 곱 하기:
def fact(n):
if n==1:
return 1
return n*fact(n-1)
재 귀 함수 장점: 정의 가 간단 하고 논리 가 뚜렷 하 다.이론 적 으로 모든 재 귀 함 수 는 순환 방식 으로 쓸 수 있 지만 순환 의 논 리 는 재 귀 가 뚜렷 하지 않다.
재 귀 함 수 를 사용 하려 면 스 택 이 넘 치지 않도록 주의해 야 합 니 다.컴퓨터 에서 함수 호출 은 스 택 (stack) 이라는 데이터 구 조 를 통 해 이 루어 집 니 다. 한 함수 호출 에 들 어 갈 때마다 스 택 프레임 을 추가 하고 함수 가 돌아 올 때마다 스 택 프레임 을 한 층 줄 입 니 다.스 택 의 크기 가 무한 한 것 이 아니 기 때문에 재 귀적 호출 횟수 가 너무 많 으 면 스 택 이 넘 칠 수 있 습 니 다.
fact(1000)
#################################################
재 귀 호출 스 택 넘 치 는 방법 을 해결 하 는 것 은 꼬리 재 귀 를 통 해 최적화 하 는 것 이다. 사실상 꼬리 재 귀 와 순환 의 효 과 는 같 기 때문에 순환 을 특수 한 꼬리 재 귀 함수 로 보 는 것 도 가능 하 다.
끝 재 귀: 함수 가 돌아 올 때 자신 을 호출 하고 return 문 구 는 표현 식 을 포함 할 수 없습니다.이렇게 하면 컴 파일 러 나 해석 기 는 꼬리 재 귀 를 최적화 시 켜 재 귀 자 체 를 몇 번 호출 하 든 하나의 스 택 프레임 만 차지 하고 스 택 이 넘 치 는 상황 이 발생 하지 않도록 할 수 있다.
상기 코드 에서 fact 함 수 는 return n * fact (n - 1) 가 곱셈 표현 식 을 도 입 했 기 때문에 끝 재 귀 가 아 닙 니 다.코드 수정:
def fact(n):
return fact_iter(n, 1)
def fact_iter(num, product):
if num==1:
return product
return fact_iter(num-1, num*product)
return 문 구 는 재 귀 함수 자체 만 되 돌려 줍 니 다. num - 1 과 num * product 는 함수 호출 전에 계산 되 고 함수 호출 에 영향 을 주지 않 습 니 다.
################################################################
재 귀적 호출 시 최 적 화 를 하면 스 택 이 증가 하지 않 기 때문에 아무리 호출 해도 스 택 이 넘 치지 않 습 니 다.
Python 해석 기 가 최적화 되 지 않 았 기 때문에 끝 재 귀 방식 을 사용 하면 스 택 이 넘 칠 수 있 습 니 다.
재 귀 함수 장점: 논리 가 뚜렷 하고 간단 하 다.단점: 너무 깊 은 호출 로 인해 스 택 이 넘 칩 니 다.
끝 재 귀 에 최 적 화 된 언어 는 끝 재 귀 를 통 해 스 택 이 넘 치 는 것 을 방지 할 수 있다.꼬리 재 귀 는 사실상 순환 등가 이 고 순환 문 이 없 는 프로 그래 밍 언어 는 꼬리 재 귀 를 통 해 순환 할 수 밖 에 없다.
Python 표준 해석 기 는 끝 재 귀 를 최적화 하지 않 았 고 모든 재 귀 함수 에 스 택 넘 치 는 문제 가 존재 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.