2011-10-23 58 views
2

我有下面的代碼Python代碼的理解

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

這相當於

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

在C(或C++,Java和C#等)

(注:這一點,如果step是肯定只會工作,如果步驟是否定的 - 即LO + R> HI-R,則需要更改支票i>(hi-r)

它的作用是在lo+r啓動計數器,通過step單位移動它,直到計數器EQ或通過hi-r的步驟。

+2

你有什麼是非常危險的,可以永遠循環。我不相信它相當於python的範圍。 – Mat

+3

@Mat:對。它可能會永遠循環,但我無法想象一種在C語言中同時適用於積極和消極「步驟」的方式。我正在更新我的答案,只爲正面案例工作。 – MAK

+0

+1負面的一步好點。 –

0

它是從lo + r(含)至hi -r(不含)的循環,以step爲增量遞增。

假設步驟是肯定的,在C的語言它可以被寫成:

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

另一種方式把它寫在Python:

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

如果步驟是否定的,則<變得>在上面的代碼。

1

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

是for循環,其中i從運行到lo+rhi-r不包括,通過step步驟的。下面是一個例子:

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

注意,在range(start, end, step)的開始和結束值可以被以任何方式有序和步驟可以是正的或負。這使得編寫C版本有點麻煩。

因此,一旦你知道的Pythonfor i in range(lo + r, hi - r, step是僞代碼:其實,

  • 它可以說是比專櫃初始化,測試和遞增的while循環更簡潔和清晰三條不同的路線;
  • 它很好地處理了Python所涵蓋的所有情況(開始和結束的順序,以及該步驟的簽名)。
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

如何使用僞代碼讀取它?

Python非常接近僞代碼。

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

意味着正是它說:在指定rangei每個值做下面的代碼。前兩個值是範圍的上限和下限,step是要使用的值之間的距離。有關更多信息,請在Python解釋器提示符處嘗試help(range)