【追求卓越06】算法--递归

引导

        递归算法算是我们比较常用的一种算法。但是想用好并不简单。本章我不再介绍简单的概念,主要讲解递归算法的优缺点和如何用递归写代码。

个人爱好

其实相对于使用while循环,我更喜欢使用递归算法。为什么呢?

  • 使用递归算法代码往往会变得更加简洁,特别当其他人使用whilefor等几十行代码实现功能,而你仅仅需要几行代码。就特别有一种自豪感。
  • 递归算法,我觉得对思维的逻辑性要求更高,递归算法常常会把人带入思维误区,脑袋一场混杂
    以上是我个人喜欢使用递归的主要原因。

但是递归算法也存在很多的弊端:

  1. 栈溢出。我们知道函数参数和局部变量都是保存在栈中的,并且每个线程的栈空间默认大小为8M。
  2. 空间复杂度高。和栈溢出的道理一样
  3. 重复计算。这个要视具体的问题了,可能会出现重复计算的现象
  4. 过多的函数调用会耗时较多。我们知道函数调用的过程会有额外的时间消耗在上下文保存中。当递归层次很深的时候,就会是一个很客观的时间消耗。

如何解决这些弊端?

其中1,3,4我们可以通过控制的递归层次来进行控制,如:

int deep = 0
f(n)
{
    deep++;
    /
*规定最多递归100层*
/
    if(deep > 100)
    {
        return;
    }
    f(n-1);
}

        关于重复计算,我们可以通过使用hash表来进行处理。将f(m)的结果进行hash保存,在处理f(n)时,现在hash表中查看是否存在该value。

如何使用递归?

        递归说简单也简单,说难也很难。简单就是将问题能够分为子问题和找到终止条件即可。困难在于如何从一个具体的问题中,分析出这两个条件

        比如教科书上利用递归计算阶乘值,这些很简单。因为你能够很容易分析出问题分为子问题和终止条件。

        但是如果你要使用递归处理下面的问题,你可以很快的给出结果吗?合并两条有序链表。可以在链表练习题中找点思路。【追求卓越03】数据结构--链表练习题-CSDN博客

        其实,我觉得想要熟练掌握好递归,你要多练,多做题,多思考。这样你才能对一个具体的问题,分析出递归公式以及终止条件。

        仅仅通过他人三言两语给你分析,你是很难得到进步。别人能够很快的分析出来,那是人家经过了大量的练习。这点要注意哦!!!

总结

        本节,我们主要介绍了大家熟知的递归算法以及它存在的一些问题:栈溢出,空间复杂度高,函数调用耗时多,以及对应的解决方式。

        写递归的方式:找到递归公式终止条件。再转化为代码。并且只有大量练习,才能熟练掌握递归算法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谢艺华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值