搭建网站吧,个人网站备案涉及支付宝,网站首页的作用,某些网站域名解析错误引导 递归算法算是我们比较常用的一种算法。但是想用好并不简单。本章我不再介绍简单的概念#xff0c;主要讲解递归算法的优缺点和如何用递归写代码。
个人爱好
其实相对于使用while循环#xff0c;我更喜欢使用递归算法。为什么呢#xff1f;
使用递归算法代码往往会变…引导 递归算法算是我们比较常用的一种算法。但是想用好并不简单。本章我不再介绍简单的概念主要讲解递归算法的优缺点和如何用递归写代码。
个人爱好
其实相对于使用while循环我更喜欢使用递归算法。为什么呢
使用递归算法代码往往会变得更加简洁特别当其他人使用whilefor等几十行代码实现功能而你仅仅需要几行代码。就特别有一种自豪感。
递归算法我觉得对思维的逻辑性要求更高递归算法常常会把人带入思维误区脑袋一场混杂 以上是我个人喜欢使用递归的主要原因。
但是递归算法也存在很多的弊端:
栈溢出。我们知道函数参数和局部变量都是保存在栈中的并且每个线程的栈空间默认大小为8M。空间复杂度高。和栈溢出的道理一样重复计算。这个要视具体的问题了可能会出现重复计算的现象过多的函数调用会耗时较多。我们知道函数调用的过程会有额外的时间消耗在上下文保存中。当递归层次很深的时候就会是一个很客观的时间消耗。
如何解决这些弊端
其中134我们可以通过控制的递归层次来进行控制如 int deep 0 f(n) { deep; / *规定最多递归100层* / if(deep 100) { return; } f(n-1); } 关于重复计算我们可以通过使用hash表来进行处理。将f(m)的结果进行hash保存在处理f(n)时现在hash表中查看是否存在该value。
如何使用递归 递归说简单也简单说难也很难。简单就是将问题能够分为子问题和找到终止条件即可。困难在于如何从一个具体的问题中分析出这两个条件。 比如教科书上利用递归计算阶乘值这些很简单。因为你能够很容易分析出问题分为子问题和终止条件。 但是如果你要使用递归处理下面的问题你可以很快的给出结果吗合并两条有序链表。可以在链表练习题中找点思路。【追求卓越03】数据结构--链表练习题-CSDN博客 其实我觉得想要熟练掌握好递归你要多练多做题多思考。这样你才能对一个具体的问题分析出递归公式以及终止条件。 仅仅通过他人三言两语给你分析你是很难得到进步。别人能够很快的分析出来那是人家经过了大量的练习。这点要注意哦
总结 本节我们主要介绍了大家熟知的递归算法以及它存在的一些问题栈溢出空间复杂度高函数调用耗时多以及对应的解决方式。 写递归的方式找到递归公式和终止条件。再转化为代码。并且只有大量练习才能熟练掌握递归算法。