关注公众号:EZ大数据(ID:EZ_DATA)。每天进步一点点,感觉很爽!
说完链表,我们来讨论讨论递归。话说,会递归和不会递归是程序员的一个分水岭。为啥子今天要说递归呢?因为,链表天然具有递归的潜质。
那么递归的本质是什么呢?
在本质上,递归是将原来的问题,转化为更小的同一问题。所有的递归算法,都可以分解为两部分,
一是求解最基本问题(递归结束的条件判断);
二是核心:把原问题转化为更小的问题。
递归的宏观语意:递归函数就是一个函数,完成一个功能而已。
那么为什么我会说,链表是具有天然递归性的呢?这是因为链表也可以这样看待,头部节点head后,挂了一个更短的链表。如图所示:
可以看做链表是头部节点后面再跟上一个更短的链表。那么我们如何用递归思想来删除链表中的元素?示意图如下:
如果想删除元素,那么可以不停的进行拆分,判断。
可能大伙还是不太明白,那么我们接下来看看递归的微观解读。
递归函数的调用,本质就是函数调用,只不过调用的函数就是自己本身而已。人狠话不多,直接举例说明:
如上图,函数按顺序执行,当运行到递归调用,此时相当于重新调用新的函数,直至调用结束,然后一层层返回。
下面,我们再来一个例子,结合代码演示来理解递归思想:
上面这个例子,非常清楚的演示了递归函数的运行。同时我们也应该认识到递归调用是有代价的,函数调用+系统栈空间。
关于递归的思想,如果掌握的好,写起代码来,简直不要太优雅,很高大上有木有。真的是程序员的一个层级分水岭。那么今天关于递归的原理,说的还算清楚,当然,理论再多不实践也是不行的。
后续多多刷题,多多思考,很多事儿熟能生巧就是大神。
对了,关于链表的话题还有很多,比如双向链表、循环链表等等。在这里就不多阐述了,有兴趣的各位,可以自行研究研究,嘿嘿嘿。
好了,今天就到这,拜了个拜~