Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';我不明白在Python中没有return语句递归函数是如何工作的_Python_Recursion_Mergesort - Fatal编程技术网

Can';我不明白在Python中没有return语句递归函数是如何工作的

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

嗨,我正在努力理解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)
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实现,所以很抱歉我不会接受你的答案,因为这不是我的问题。