2011-10-23 5 views
2

나는 다음 한 코드파이썬 코드를 이해

def compare_and_swap(x, a, b): 
    if x[a] > x[b]: 
     x[a], x[b] = x[b], x[a] 

def oddeven_merge(x, lo, hi, r): 
    step = r * 2 
    if step < hi - lo: 
     oddeven_merge(x, lo, hi, step) 
     oddeven_merge(x, lo + r, hi, step) 
     for i in range(lo + r, hi - r, step): 
      compare_and_swap(x, i, i + r) 
    else: 
     compare_and_swap(x, lo, lo + r) 

def oddeven_merge_sort_range(x, lo, hi): 
    """ sort the part of x with indices between lo and hi. 

    Note: endpoints (lo and hi) are included. 
    """ 
    if (hi - lo) >= 1: 
     # if there is more than one element, split the input 
     # down the middle and first sort the first and second 
     # half, followed by merging them. 
     mid = lo + ((hi - lo)/2) 
     oddeven_merge_sort_range(x, lo, mid) 
     oddeven_merge_sort_range(x, mid + 1, hi) 
     oddeven_merge(x, lo, hi, 1) 

def oddeven_merge_sort(x): 
    oddeven_merge_sort_range(x, 0, len(x)-1) 

>>> data = [4, 3, 5, 6, 1, 7, 8] 
>>> oddeven_merge_sort(data) 
>>> data 
[1, 2, 3, 4, 5, 6, 7, 8] 

모든 것이 나를 위해 분명하다,하지만이 라인은 이해할 수없는 나는 그것이 의사 코드를 사용하고 계십니까? 또는에서 읽을 수 있습니다 얼마나 잘

for i in range(lo + r, hi - r, step): 

다른 언어 (예 : C++)?

답변

3

C에서

for(int i=lo+r;i<(hi-r);i+=step) 

이 동등 (또는 C++, 자바, C#을, 등)

(참고 :. step가 긍정적 인 경우에만 동작합니다 단계가 부의 경우 - 즉, LO + R> 안녕하세요-R, 당신은

는 그것이 무엇을하는 lo+r에서 카운터를 시작입니다 i>(hi-r)의 체크를) 변경 카운터 EQ까지 step 단위로 이동해야합니다 이전 또는 이후 단계는 hi-r입니다.

당신은 (긍정적 인 조치를위한) 다음의 의사 코드로 그것을 읽을 수
+2

당신이 가지고있는 것은 매우 위험하며, 영원히 반복 할 수 있습니다. 파이썬 범위와 같다고 나는 믿지 않는다. – Mat

+3

@Mat : True. 영원히 반복 될지 모르지만 C와 유사한 언어로 양성 및 음성 모두 '단계'에서 작용하는 방식을 생각할 수 없습니다. 긍정적 인 경우에만 작동하도록 내 대답을 업데이트하고 있습니다. – MAK

+0

부정적인 단계에 대해 +1 좋은 지적. –

0

step 단위로 lo + r (포함)부터 hi -r (제외)까지의 a 루프입니다. 파이썬에서 쓸

for (i = lo + r; i < hi - r; i += step) { ... } 

또 다른 방법 : 단계가 음수이면

i = lo + r 
while i < hi - r: 
     # loop body 
     i += step 

<이된다

가정 단계는 같이 쓸 수있는 C 같은 언어, 긍정적 위의 코드에서 >

1

라인

for i in range(lo + r, hi - r, step): 

step의 공정에 의해, 포함되지 lo+r에서 hi-r달리기 전 루프와위한 이다. range(start, end, step)에서 시작과 끝 값이 어떤 방식 주문 가능하고 단계는 포지티브 또는 네거티브 수 있다는

>>> for i in range(10, 31, 3): 
...  print i 
...  
10 
13 
16 
19 
22 
25 
28 

주 : 여기 일례이다. 이것은 C 버전 작성이 약간 번거로워진다. 당신이 파이썬을 알면

따라서, for i in range(lo + r, hi - r, step는 의사 코드입니다 : 사실,

  • 은 카운터 초기화, 테스트 및의 증가와 while 루프에 비해 거의 틀림없이 더 간결하고 읽기 쉬운입니다 세 가지 다른 라인;
  • 파이썬에서 다루는 모든 경우를 훌륭하게 처리합니다 (시작과 끝의 순서 및 단계의 부호).
0

: 음 단계는

i = lo + r 
while i < hi - r: 
    # body of loop 
    i = i + step 

: 즉

i = lo + r 
while i > hi - r: 
    # body of loop 
    i = i + step 

, 그것은 처음부터 i 변수를 반복 할 값이 도달하거나 두 번째 값을 통과 할 때까지 루프를 통해 매번 세 번째 값으로 조정합니다.

1

의사 코드를 사용하여 읽을 수있는 방법은 무엇입니까?

파이썬은 의사 코드와 매우 비슷합니다. 지정된 range에서 i의 각 값에 다음 코드를 수행

for i in range(lo + r, hi - r, step): 

는 말한다 정확히 무엇을 의미합니다. 처음 두 값은 범위의 상한 및 하한이며, step은 사용할 값 사이의 거리입니다. 자세한 내용은 파이썬 인터프리터 프롬프트에서 help(range)을 시도하십시오.