无法理解递归函数如何在没有Python

时间:2018-05-07 07:07:39

标签: python recursion mergesort

您好我正在努力理解递归如何在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)

3 个答案:

答案 0 :(得分:1)

python通过引用传递列表,这意味着原始列表可以通过给列表作为参数的函数进行修改,因此当您使用以下函数调用函数时:

mergeSort(lefthalf)
mergeSort(righthalf)

lefthalfrighthalf本身已排序,请注意外部对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):部分合并了各个部分。