Can';我不明白在Python中没有return语句递归函数是如何工作的
嗨,我正在努力理解Python中递归是如何工作的。我特别使用Python 3.5版本。我正在研究Python中合并排序算法的实现:Can';我不明白在Python中没有return语句递归函数是如何工作的,python,recursion,mergesort,Python,Recursion,Mergesort,嗨,我正在努力理解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:] mergeSor
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)
def合并排序(列表):
打印(“拆分”,列表)
如果len(alist)>1:
mid=len(alist)//2
lefthalf=alist[:mid]
righthalf=alist[中间:]
合并排序(左半部分)
合并排序(右半部分)
i=0
j=0
k=0
而i
我无法理解这个实现是如何工作的,因为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)
def合并排序(列表):
打印(“拆分”,列表)
如果len(alist)>1:
mid=len(alist)//2
lefthalf=alist[:mid]
righthalf=alist[中间:]
lefthalf=合并排序(lefthalf)
righthalf=合并排序(righthalf)
i=0
j=0
k=0
而i
python通过引用传递列表,这意味着原始列表可以由作为参数提供给该列表的函数修改,因此当您使用以下函数调用该函数时:
mergeSort(lefthalf)
mergeSort(righthalf)
lefthalf
和righthalf
本身是排序的,请注意对mergeSort()
的外部调用也假定原始列表已修改,它不会返回新的排序列表,正如我所说,它对现有列表进行排序合并排序分两步进行。首先,它递归地将列表一分为二,直到生成包含一个成员的列表。在您提到的代码中,if len(alist)>1:
递归地打破列表。
在第二步中,它只是按照正确的顺序合并小片段,直到创建第一个列表(但按顺序)。所以在第二步中,它首先将列表与一个成员合并,将列表与两个成员合并,依此类推<代码>而i而i
和而j
代码中的部分合并了片段 我建议您将代码粘贴到此处:
然后单击“可视化执行”。您将看到代码的执行情况以及每行后面每个变量的状态。请将代码粘贴到问题中,不要使用外部链接,因为它们可能会在将来中断,这样查看此问题的人在不查看代码的情况下将无法看到代码,最可能的解释是,您正在查看的实现是对列表进行适当排序,因此它会更改传入的列表,因此无需返回任何内容。非常抱歉!我编辑了我的帖子并粘贴了代码。现在我可以看到了。比如这里:def myfunc(alist):alist.append(2)def testf(alist):myfunc(alist)return(alist)testf([1,2,3])将返回[1,2,3,2]当然你的解释是对的,但是我没有努力理解算法本身,而是理解Python实现,所以很抱歉我不会接受你的答案,因为这不是我的问题。