[英]Recursion in Merge Sort , Quick Sort and traversal of trees
在学习不同的算法(如合并排序、快速排序或树遍历)时,我观察到有两个递归调用紧随其后。
完全看不懂,请简单解释一下为什么要使用两个递归调用? 这是任何一种模式吗?
还有任何算法可以进行两次以上的立即递归调用吗?
归并排序
m_sort(numbers, temp, left, mid);
m_sort(numbers, temp, mid+1, right);
树遍历
预购(节点。左)
预购(节点。右)
有两个递归调用,因为相同的功能需要在两个不同的位置执行。 在从根开始遍历树的情况下,您要递归地从左向下再向右向下。 函数调用工作的方式, F
调用preorder(node.left)
而对preorder(node.right)
一无所知。 当它进入node.left
它现在位于B
。 将会一直进行相同的递归调用,直到底部A
为止。 当预购(node.left)从返回A
则在代码中B
调用preorder(node.right)
和递归将继续。
这并不是一种模式,而是在许多二进制结构上进行递归工作的本质,其中采用分而治之策略将工作拆分成较小的部分,然后分别对每个部分执行递归直到琐碎满足大小写(例如,返回时,如A
没有子节点的节点)
来源: Sorted_binary_tree.svg的 “ Sorted Binary tree preorder ”: Miles衍生作品: Pluke ( 交谈 ) -Sorted_binary_tree.svg 。 通过Wikimedia Commons在公共领域许可。
你想调用它两次的原因是因为它把问题分成了两半。
对于排序情况,您希望对下半部分和上半部分进行排序。 在树的情况下,您要遍历左轨道和右轨道。 恰好这个数字是 2,因为您在每次递归中将域分成两半。 但是你可以将问题分成你想要的部分,有些问题甚至可能在每次递归中都有可变数量的部分。
一个简单的想象方法,当你站在十字路口时,你会考虑从那里可以去多少个方向,如果你想访问所有的方向,那么你需要调用所有的方向。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.