2016-12-29 1 views
0

중첩 된 튜플 대 평면 목록을 생성하는 문제를 해결하려고했습니다. 이 함수 (n_iter)가 수행하는 최대 반복 횟수를 얻고 싶었습니다. 나는 겉으로보기에는 "and"연산자를 사용하여 문제를 해결했다. 또한,이 기능은 현저하게 빠릅니다. 왜이 논리가 효과가 있었는지 누구나 알고 있습니까? "and"가 나타나는 평가와 관련이 있습니까? 이것은 숙제를위한 것이었지만 나는 대답 한 것 같습니다.파이썬 재귀 "및"기능?

#n_iter should start as zero 
def break_it_down(n, n_iter): 
    if n > 2: 
     division, subtraction = n/2.0, n-1.0 
     n_iter +=1 
     return break_it_down(division,n_iter) and break_it_down(subtraction, n_iter) 
    return n_iter 
+0

질문이 명확하지 않습니다. 너는 무엇을하려고 하는가? 어떤 가치를 당신의 함수에 전달했는지, 그 값에서 2를 뺀 값을 반환합니다. 코드로 무엇을 달성하고 싶습니까? 너와 그것의 결과를 간략하게 설명해주기 바란다. –

+0

'and'이 뭘한다고 생각하니? 그것은 틀리게 보인다. – user2357112

+0

내 코드는 두 플레이어가 2로 나누거나 1을 뺄 수있는 게임에서 플레이어가 사용할 수있는 최대 플레이 수를 결정하기위한 것입니다. 그리고 중첩 된 튜플에서 "최대"값을 반환합니다. – CalTex

답변

0

그 이유는 and이 "짧은 커터 타이핑"이기 때문입니다.

<expr-1> and <expr-2> 

에서 발현 <expr-2><expr-1>의 결과가 "falsy는"(즉, 그것이 논리 컨텍스트 False 간주된다)을 평가하지 않는다. n=8 나눗셈 호출, 예를 들어 사용자의 경우

대신 감산 (1/2 입력 정수 숫자 0이고, 파이썬 2)

n=4 → n=2 → n=1 -> n=0 

이다

n=8 → n=7 → n=6 → n=5 → n=4 → n=3 → n=2 → n=1 → n=0 

n=0은 "거짓"이지만 빼기보다 나누기가 훨씬 빠릅니다. 이것은 당신이 첫 번째 부문으로 확인하는 경우에만 다음 빼기 전화의 수는 훨씬 작은 수 있다는 것을 의미 : 더 큰 입력이

# division first 
n=8 
n=8/2=4 and n=8-1=7 
n=4/2=2 and n=4-1=3 
n=2/2=1 and n=2-1=1 
n=1/2=0 and n=1-1=0 (stop) 

# subtraction first 
n=8 
n=8-1=7 and n=8/2=4 
n=7-1=6 and n=7/2=3 
n=6-1=5 and n=6/2=3 
n=5-1=4 and n=5/2=2 
n=4-1=3 and n=4/2=2 
n=3-1=2 and n=3/2=1 
n=2-1=1 and n=2/2=1 
n=1-1=0 and n=1/2=0 (stop) 

는 차이가 더 큰 것입니다 (예를 들어 256 0에 도착하는 256 뺄셈이 필요하지만 단 8 개 부서).

+0

좋아요! 정말 감사드립니다! 총체적인 의미를가집니다. 나를 가르치는 시간을내어 주셔서 감사합니다! – CalTex