【发布时间】:2018-05-07 07:07:39
【问题描述】:
您好,我正在努力理解递归在 Python 中的工作原理。我特别在 Python 3.5 版本中工作。我正在研究 Python 中合并排序算法的这种实现:
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 函数没有返回语句。此外,在函数体顶部对 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)
【问题讨论】:
-
请将代码粘贴到问题中,不要使用外部链接,因为它们将来可能会中断,然后查看此问题的人将无法看到代码
-
不看代码,最可能的解释是你正在查看的实现是就地排序列表,所以它改变了传递的列表in,因此不需要返回任何东西。
-
非常抱歉各位!我编辑了我的帖子并粘贴了代码。
标签: python recursion mergesort