我理解递归的基本原理,在处理简单的事情时,例如计算数字的阶乘,这是递归的最基本用法,它完全没有混淆。但是,当你在更复杂的环境中开始使用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; 生成?我希望我的问题对你有意义。
谢谢你的帮助!
答案 0 :(得分:0)
答案是相当广泛的。要完全理解这一点,您需要了解stackbuildup如何处理递归以及所述构建中的指针如何工作。
这是递归调用的,因为列表需要通过将其分成两半来分解,直到它处于可能的最小单位(余数为1或0)一旦完成,堆栈构建将使用其预定义指针进行回溯所有以前的调用实例。
这是一种深入的编程语言概念。
有关堆栈构建和回调引用的更多信息,请参阅此处。 https://en.wikipedia.org/wiki/Call_stack