您好我正在努力理解递归如何在Python中运行。我特别在Python 3.5版本中工作。我正在研究Python中Merge排序算法的这种实现:
def mergeSort(alist):
print("Splitting ",alist)
if len(alist)>1:
mid = len(alist)//2
lefthalf = alist[:mid]
righthalf = alist[mid:]
mergeSort(lefthalf)
mergeSort(righthalf)
i=0
j=0
k=0
while i < len(lefthalf) and j < len(righthalf):
if lefthalf[i] < righthalf[j]:
alist[k]=lefthalf[i]
i=i+1
else:
alist[k]=righthalf[j]
j=j+1
k=k+1
while i < len(lefthalf):
alist[k]=lefthalf[i]
i=i+1
k=k+1
while j < len(righthalf):
alist[k]=righthalf[j]
j=j+1
k=k+1
print("Merging ",alist)
alist = [54,26,93,17,77,31,44,55,20]
mergeSort(alist)
print(alist)
我无法理解这个实现是如何工作的,因为MergeSort函数没有return语句。此外,函数体顶部的MergeSort递归调用的结果不会分配给lefthalf和righthalf变量。因此,我无法理解如何将合并部分设置为与此实现一起使用。当我在Python中运行此代码时,它当然可以正常工作。我想我不能在Python中正确理解闭包,但如果有人能指出我正确的方向,那就太好了。提前谢谢!
以下是我了解其运作方式的版本:
def mergeSort(alist):
print("Splitting ",alist)
if len(alist)>1:
mid = len(alist)//2
lefthalf = alist[:mid]
righthalf = alist[mid:]
lefthalf = mergeSort(lefthalf)
righthalf = mergeSort(righthalf)
i=0
j=0
k=0
while i < len(lefthalf) and j < len(righthalf):
if lefthalf[i] < righthalf[j]:
alist[k]=lefthalf[i]
i=i+1
else:
alist[k]=righthalf[j]
j=j+1
k=k+1
while i < len(lefthalf):
alist[k]=lefthalf[i]
i=i+1
k=k+1
while j < len(righthalf):
alist[k]=righthalf[j]
j=j+1
k=k+1
print("Merging ",alist)
return(alist)
答案 0 :(得分:1)
python通过引用传递列表,这意味着原始列表可以通过给列表作为参数的函数进行修改,因此当您使用以下函数调用函数时:
mergeSort(lefthalf)
mergeSort(righthalf)
lefthalf
和righthalf
本身已排序,请注意外部对mergeSort()
的调用也假设原始列表已被修改,它不会返回新的排序列表,如我说对现有列表进行排序
答案 1 :(得分:1)
我可以建议您在此处粘贴代码:http://pythontutor.com/visualize.html#mode=edit
然后点击“Visualize execution”。您将看到代码的执行方式以及每个变量的状态在每一行之后。
答案 2 :(得分:0)
合并排序分两步进行。首先,它将列表递归地分成两半,直到它产生具有一个成员的列表。在您提到的代码中,if len(alist)>1:
递归地破坏列表。
在第二步中,它只是以正确的顺序合并小块,直到创建第一个列表(但按顺序)。所以在第二步中,它首先将列表与一个成员组合,组合列表与两个成员组合,等等。 while i < len(lefthalf) and j < len(righthalf):
,
代码中的while i < len(lefthalf):
和while j < len(righthalf):
部分合并了各个部分。