合并排序函数的递归令人困惑

时间:2017-06-20 15:47:31

标签: python list sorting recursion

我理解递归的基本原理,在处理简单的事情时,例如计算数字的阶乘,这是递归的最基本用法,它完全没有混淆。但是,当你在更复杂的环境中开始使用Recursion时,它开始让我感到非常困惑。

就我而言,我想创建一个使用" merge sort"使用递归对列表中的项进行排序的方法。所以我开始工作,这是我第一次尝试时提出来的(不是我必须解决一些错别字):

def merge_sort(ls):
  size = len(ls)
  if size <= 1:
    return ls
  left = merge_sort(ls[:size/2])
  right = merge_sort(ls[size/2:])
  return merge(left, right)

def merge(left, right):
  ls = []
  ln1 = len(left)
  ln2 = len(right)
  length = ln1 + ln2
  while length > 0:
    if not left:
      ls.append(right.pop(0))
      length -= 1
    elif not right:
      ls.append(left.pop(0))
      length -= 1
    else:
      if left[0] < right[0]:
        ls.append(left.pop(0))
        length -= 1
      elif right[0] < left[0]:
        ls.append(right.pop(0))
        length -= 1
  return ls

print merge_sort([8,5,4,6,1])

我点击了运行它有效,但我不明白为什么它有效。是的,我创建了一段代码来执行我们想要做的事情,但我不明白为什么。

所以&#34; merge_sort&#34; 将列表拆分为两部分,直到有一个包含单个项目的简单列表。它使用递归来完成此操作,当我们得到一个包含单个项目的简单列表时,它会将其分配给新列表,即。然后我在&#34; merge&#34; 函数中使用这两个新列表对它们进行排序,并以正确的方式将它们合并在一起。到目前为止一切都那么好,但是当我点击&#34;执行&#34;是为了代码在前两个项目停止,并打印一个包含2个排序项目的小列表。然而,&#34; merge_sort&#34; 继续前进。即使我相信它应该在执行后结束:

return merge(left, right)

现在这是我的问题。为什么它会回到&#34; merge_sort&#34; 的开头?它如何保存旧值而不会搞砸新的排序&#34;小列表&#34;由&#34;合并&#34; 生成?我希望我的问题对你有意义。

谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

答案是相当广泛的。要完全理解这一点,您需要了解stackbuildup如何处理递归以及所述构建中的指针如何工作。

这是递归调用的,因为列表需要通过将其分成两半来分解,直到它处于可能的最小单位(余数为1或0)一旦完成,堆栈构建将使用其预定义指针进行回溯所有以前的调用实例。

这是一种深入的编程语言概念。

有关堆栈构建和回调引用的更多信息,请参阅此处。 https://en.wikipedia.org/wiki/Call_stack