关于递归的一点说明,今天看到左式堆合并操作时对递归突然有了很好的理解,就结合《数据结构和算法分析》第一章的关于递归的说明,好好理解了下递归(如何使用递归)
当然,有些话是引用书本的
首先我们来说一下递归的四条基本法则(下面会结合例子说明的):
重点内容
一、基准情形:在递归实现中一定要有某些基准情形,它无需递归就可以实现。
二、不断推进:对于那些需要用递归求解的情形,我们设计的每一次递归都必须在向基准情形推进(也就是说,在我们递归调用函数本身时,参数的值总有一次复合基准情形,然后递归调用就结束了)
三、设计法则:假设所有的递归都能够实现(也就是我们设计了递归调用不必清楚的知道每一次的具体实现过程,把递归调用的过程当成是一个黑匣子)
四、合成效益法则:在进行递归调用时千万不要,让递归做相同参数同样的事情。
接下来结合左式堆来实现一个递归的合并两个左式堆(不考虑合并后左式堆的结构顺序被破坏的情况,具体实现书本P149)
进行递归的实现说明:
一、如果两个堆中有一个堆是空的那就返回另一个堆;
二、否则就比较两个堆*根*的大小,将根值比较大的堆与
根值比较小的堆的右子堆进行合并。
接下来是具体的实现分析:
1、基准情形的分析:
由上面的说明可以知道这个合并的基准情形就是
当一个堆为空时,返回另外一个堆。(这种情形下不需 要递归调用,直接判断就可以返回结果)
2、不断推进:当然是不断判断子堆根的大小然后进行右子堆与大根子堆的合并(这个显然,都后面有一个子堆为空,那么这时就是一个递归调用结束)![这是我写的一个合并的步骤](https://img-blog.csdn.net/20171112174915671?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2lsbGVyaQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
实现的详细例程:
priorityQueue
merge(PriorityQueue H1,priorityQueue H2)
{
if(H1==NULL)
return H2;
if(H2==NULL)
return H1;
else
{
if(H1->element > H2->element)
return H2=merge(H1,H2->right);
else
return H1=merge(H1->right,H2);
}
}/*我写的这个还要进行对返回的左式堆进行其性质的检查和调整,我这边就不了,具体你可以看书本*\
好了,这是我对递归结合左式堆的一些想法,如果你看到希望你看懂,并对你对递归的理解有帮助。