2012-06-04 2 views
0
total = 0 
for i in range(0, some upper bound): 
    total += i 

죄송합니다. 기본 사항이지만 이것들이 많으며 편안함보다 많은 공간을 차지하고 있습니다.Python에서 숫자의 산술 시퀀스를 더 빨리 요약하는 방법이 있습니까?

+1

더 빠르고 짧은 코드를 원하십니까? – dbf

+0

더 짧고 이상적! 단점이 있습니까? – MyNameIsKhan

+3

예,'sum'을 사용하는 솔루션이 더 읽기 쉽고 'Gauss' 기능이 더 빠릅니다. – schlamar

답변

15
total = sum(range(upper)) 

또는

total = upper * (upper - 1)/2 

첫번째 파이썬이고, 두번째 가우스.

편집 : 0부터 시작하지 않는 경우 : 다시 가우스에 따라,

total = sum(range(lower, upper)) 

하거나, lower 위해 동일을 upper와 동일한 작업을 수행하고 빼지 : 파이썬에있는 경우

total = upper * (upper - 1)/2 - lower * (lower - 1)/2 

2.x이면 rangexrange으로 바꿉니다.

+1

모든 추가를 건너 뛸 수있는 수식은 +1입니다. – kindall

+0

위대한 작품! 고맙습니다. 0에서 시작하지 않는 상황의 경우 합계 (범위 (아래, 위))를 수행합니까? – MyNameIsKhan

+0

나중에 사용하는 경우 iterables 대신 항상 generator를 사용해야합니다. 이 경우'range' 대신'xrange'를 사용해야합니다. – schlamar

2

total = some_upper_bound * (some_upper_bound -1)/2

lower_bound != 0 경우 :

total = (some_upper_bound - lower_bound) * (some_upper_bound + lower_bound - 1)/2

업데이트 : 그것은 허용 대답의 일부의 정확한 복사본이 거의 그대로 내가 독립적으로 대답하지만 나는 (내 대답을 삭제 한 것). 그러나 대답은 lower_bound이 포함될 때 매우 작지만 이론적으로 흥미로운 향상입니다. 내 대답에는 두 개의 곱셈/나누기 (더하기/빼기보다 상대적으로 더 비쌉니다)가 포함되어 있고 다른 대답에는 4가 포함되어 있습니다.

0

eumiro에서 확장하십시오. 명확성을 위해 Gauss 메서드를 캡슐화하는 메서드를 작성하려고 할 수 있습니다. (I 파이썬 구문을 모르기 때문에 그루비로 작성) I는 다음과 같이 제안 :

public int sumUpToBoundary(def upper_bound){ 
    return (upper_bound) * (upper_bound - 1)/2; 
} 

public int sumBetween(def lower_bound, def upper_bound){ 
    return sumUpToBoundary(upper_bound) - sumUpToBoundary(lower_bound); 
} 

public void someOtherMethod() { 
    int total = sumUpToBoundary(some_upper_bound); 
    int total2 = sumBetween(some_lower_bound, some_upper_bound); 
} 

UPDATE : @mspy 내 메소드 서명 파이썬의 스타일에없는 것을 지적했다. 이 예제를 좀 더 파이썬과 비슷한 구문을 지원하는 Groovy로 업데이트했습니다.

+0

좋은 의도가 있지만이 Java 예제는 엄격하게 파이썬 원칙에 위배됩니다. 주로 이름의 데이터 유형은 매우 나쁜 생각입니다. 우리는 여기에 오리 입력을하고 있습니다 .-) – schlamar

+0

@ ms4py - 독자가 내 대답을 적절한 언어로 번역 할 수 있기를 기대하지만, 나는 파이썬으로 대답하지 않았다. 더 많은 Python-y 구문을 지원하는 Groovy에 대한 답을 편집했습니다. (-1을 제거하십시오). – Spina

관련 문제