繁体   English   中英

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

[英]Recursion on a merge sort function is confusing

我了解递归的基本原理,在处理简单的事情(例如计算数字的阶乘)时,它一点也不混淆,这是递归的最基本用法。 但是,当您在更复杂的环境中开始使用递归时,它对我来说真的很令人困惑。

就我而言,我想创建一个函数,该函数使用“合并排序”方式通过递归对列表中的项目进行排序。 所以我开始工作,这是我第一次尝试时想到的(不是我真的必须解决一些错字):

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])

我单击运行,它起作用了,但是我不明白为什么它起作用。 是的,我创建了一段代码,该代码可以完成预期的工作,但我不明白为什么。

因此, “ merge_sort”将列表分为两部分,直到有一个包含单个项目的简单列表为止。 它使用递归进行此操作,当我们获得一个包含单个项目的简单列表时,它将其分配给一个新列表,即leftright 然后,我在“合并”功能中使用这2个新列表对它们进行排序,并以正确的方式将它们合并在一起。 到目前为止,一切都很好,但是当我点击“执行”时,我期望代码在前两个项目处停止并打印一个包含2个已排序项目的小列表。 但是“ merge_sort”一直在继续。 即使我相信它应该在执行后结束:

return merge(left, right)

现在这是我的问题。 为什么它返回“ merge_sort”的开头,又如何保存旧值而又不弄乱 “ merge”生成的新排序的“小列表呢? 希望我的问题对您有意义。

谢谢您的帮助!

答案很广泛。 为了完全理解这一点,您需要了解堆栈构建如何与递归一起工作以及所述构建中的指针如何工作。

递归调用此方法是因为需要通过将列表分成两半来分解,直到达到最小可能的单位(剩余的1或0)。一旦完成,堆栈构建将使用其预定义的指针来追溯所有先前的通话实例。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM