2011-10-23 55 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)