递归结合左式堆的一个具体说明!

关于递归的一点说明,今天看到左式堆合并操作时对递归突然有了很好的理解,就结合《数据结构和算法分析》第一章的关于递归的说明,好好理解了下递归(如何使用递归)
当然,有些话是引用书本的
首先我们来说一下递归的四条基本法则(下面会结合例子说明的):

重点内容
一、基准情形:在递归实现中一定要有某些基准情形,它无需递归就可以实现。
二、不断推进:对于那些需要用递归求解的情形,我们设计的每一次递归都必须在向基准情形推进(也就是说,在我们递归调用函数本身时,参数的值总有一次复合基准情形,然后递归调用就结束了)
三、设计法则:假设所有的递归都能够实现(也就是我们设计了递归调用不必清楚的知道每一次的具体实现过程,把递归调用的过程当成是一个黑匣子)
四、合成效益法则:在进行递归调用时千万不要,让递归做相同参数同样的事情。

接下来结合左式堆来实现一个递归的合并两个左式堆(不考虑合并后左式堆的结构顺序被破坏的情况,具体实现书本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);
        }
    }/*我写的这个还要进行对返回的左式堆进行其性质的检查和调整,我这边就不了,具体你可以看书本*\

好了,这是我对递归结合左式堆的一些想法,如果你看到希望你看懂,并对你对递归的理解有帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值