Python의 반복 및 재귀 방법에 대한 자세한 설명

高洛峰
풀어 주다: 2017-03-17 17:11:18
원래의
1648명이 탐색했습니다.

상황이 발생하면 재귀 연산을 수행해야 하는데, 그 횟수가 10,000회가 넘을 정도로 매우 많습니다. 10,000번이 넘는 재귀에 대해서는 이야기하지 않겠습니다. 원본 테스트 코드는 java에 있습니다. jdk와 컴파일 환경이 없으면 python

을 사용해 보겠습니다. 먼저 원본 Java 코드를 살펴보겠습니다. 🎜 >

public class UpCount {
    private long calc(int depth) {
        if (depth == 0) return 1;
        long cc = calc(depth - 1);
        return cc + (depth % 7) + ((((cc ^ depth) % 4) == 0) ? 1 : 0); 
    }
    public static void main(String[] args) {
        UpCount uc = new UpCount();
        System.out.println(uc.calc(11589));
    }
}
로그인 후 복사

Java를 많이 플레이해본 적은 없지만 이 코드는 전혀 스트레스를 주지 않습니다. 빠르게 정리하고 Python 코드로 변경했습니다.


def calc(depth):
    if depth == 0:
        return 1
    cc = long(calc(depth-1))
    xor_mod = (cc ^ depth)%4
    if xor_mod == 0:
        return cc+(depth%7)+1
    else:
        return cc+(depth%7)
 
number = long(calc(11589))
print number
로그인 후 복사

코드 붙여넣기, F5 , 문제가 발생했습니다


이 버전의 코드는 원래 길게 추가되지 않았습니다. 10자리 이상의

정수 문자열을 직접 사용할 수 있으므로 뭔가 문제가 있는 것으로 의심됩니다. to do with long

물론 사실 이것은 long과 관련이 없습니다. Python에서 지원하는 정수 길이는 매우 깁니다. 이전에 작성한 코드를 참조하세요.

cimal = 7
original = 28679718602997181072337614380936720482949
array = ""
result= ""
while original !=0:
    remainder = original % cimal
    array += str(remainder)
    original /= cimal
length = len(array)
for i in xrange(0,length):
    result += array[length-1-i]
print result
로그인 후 복사

코드는 긴 문자열을 변환합니다. 10진수는 16진수 표현이나 8진수 또는 16진수로 변환될 수 있습니다. 문제를 해결하려면 유클리드 나눗셈을 사용하세요.


따라서 오류는 숫자의 크기에 있지 않다고 볼 수 있습니다. 결국 11589는 오늘날의 컴퓨터에 2^16과 65536이 있습니다.

사실 여기까지만 해도 이전 재귀 오류가 발생한 진짜 이유에 대해 이야기해보겠습니다. 지쳤어요

재귀 오류가 발생하는 이유는 Python의 기본 재귀 오류 때문입니다. 제한은 1,000회 정도인데 여기서는 10,000회 이상 실행해야 합니다. 새로 고치는 데 시간이 오래 걸렸습니다. 실행

시간

오류: 최대 재귀 깊이를 초과했습니다그래서 빠르게 확인했습니다. 그리고 Python의 최대 재귀 횟수를 직접 설정할 수 있음을 발견했습니다. 확장으로 공식 웹사이트 문서

전체를 직설적으로 말하면 이점을 방지할 수 있습니다. 충돌이 발생하면 Python 언어는 기본적으로 횟수에 제한을 추가하므로 이 제한을 변경하면

import sys

#

set<🎜으로 괜찮을까요? > 최대 깊이는 20000

sys.setrecursionlimit(20000)

위 코드를 삽입하고 과감하게 20000으로 변경합니다. 이제 이 제한이 없으면 문제가 없을 텐데 결과는 충격적입니다. , 아무것도 출력되지 않았습니다. 혼란스러워서

계속 확인하지 않았습니다. 친구 littlehann에게 물어보고 논의했지만 이 문제를 더 자세히 조사하지는 않았습니다. 그러나 실제 응용 프로그램에서 재귀 연산의 효율성에 관해서는 교과서를 제외하고는 실제로 재귀를 사용하는 경우가 거의 없습니다. 별로 인상적이지는 않지만

for 문

은 다음과 같습니다.

코드는 다음과 같습니다.

def calc(depth):
    tmp = 0
    result = 1
    
    for i in xrange(0,depth+1):
        cc = result
        if (cc ^ i)%4 == 0:
            tmp = 1
        else:
            tmp = 0
        result = result + (i)%7 + tmp
        
    return result
final = calc(11589)
print final
로그인 후 복사
코드 몇 줄이면 금방 완료됩니다. 지난 인터뷰를 생각하면 tx 면접관이 알고리즘에 대해 물었을 때 재귀를 사용하여 연산을 구현한다고 언급했습니다. 이제 Iteration도 사용할 수 있습니까?

시간이 오래 걸려 당시 질문을 명확하게 기억할 수 없지만, 오늘의 교훈은 대부분의 경우(작성된 코드 적음, 느낌에 따라 추정) 재귀적 효율성입니다. 상대적으로 낮다는 건

수업에서도 언급한 게 확실해요. 반복을 사용하는 것의 효율성은 확실히 더 높습니다(반복의 구체적인 개념은 명확하게 기억나지 않습니다). 최소한
루프

를 사용하면 문제가 없을 것이라고 확신합니다. 하지만 재귀 제한을 변경해도 여전히 파업이 발생합니다

마지막으로 python long VS C long long에 대한 또 다른 링크가 게시되어 있습니다. 관심이 있으시면 확인해 보세요

위 내용은 Python의 반복 및 재귀 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!