算法基础篇(3)------递归与分治

● 每周一言

渴望别人的理解,得先学会理解别人。

导语

一段递归代码,通常是简洁抽象的。如果说循环是一种横向的顺序遍历,递归就是一种纵向的来回遍历。而分治则吸取了递归的精华,是一种高效的递归法。那么,递归和分治的具体思想分别是什么?

递归

一个函数、过程、概念或数学结构,如果在其定义或说明内部又直接或间接地出现有其本身的引用,则称它们是递归的或者是递归定义的。在程序设计中,过程或函数直接或者间接调用自己,被称为递归调用

递归可以划分为递推回归两个阶段。问题逐层往前推进,这一过程叫做递推;子问题逐一解决,最后回到原问题,这一过程叫做回归。二者交替配合,就形成了递归。

《算法基础篇(3)------递归与分治》

采用递归编写的代码具有结构清晰,可读性强等优点,且递归算法的设计比非递归算法的设计往往更加简洁容易。所以当问题本身是递归定义的,或问题所涉及到的数据结构是递归定义的,或问题的解决方法为递归形式的时候,通常采用递归解决。经典的递归问题有上一篇中的
快速排序以及
八皇后
汉诺塔
全排列问题等。

《算法基础篇(3)------递归与分治》

当然,递归虽然有以上诸多优点,但仍然是一种低效的算法。其一,代码抽象容易出错;其二,程序很难调试。因此建议能用非递归实现的时候尽量用非递归实现,避免麻烦。

分治

分治就是“分而治之”的意思,其实质是将原问题分成n个规模较小而结构与原问题相似的子问题,然后递归地解这些子问题,最后合并结果得到原问题的解

分治算法有两个适用条件:其一,大问题能分解成若干个独立的子问题;其二,每个子问题的求解过程都和大问题相似。这两个条件决定了分治的递归过程是受限的,通常能明确知道递归的终止条件及其每一层的逻辑,因此分治是一种高效的基本算法。比如上一篇中讲到的归并排序,用的就是分治法。这里我再展开讲一个经典的分治算法题:地毯填补

题目描述: 相传在一个古老的阿拉伯国家里,有一座宫殿。宫殿里有个四四方方的格子迷宫,国王选择驸马的方法非常特殊,也非常简单:公主就站在其中一个方格子上,只要谁能用地毯将除公主站立的地方外的所有地方盖上,美丽漂亮聪慧的公主就是他的人了。公主这一个方格不能用地毯盖住,毯子的形状有所规定,只能有以下四种选择:

《算法基础篇(3)------递归与分治》

分治法的提示如下。敬请期待下节内容 贪心与动归

《算法基础篇(3)------递归与分治》

结语

感谢各位的耐心阅读,后续文章于每周日奉上,欢迎大家关注小斗公众号 对半独白

《算法基础篇(3)------递归与分治》

    原文作者:递归与分治算法
    原文地址: https://blog.csdn.net/cherrylvlei/article/details/55803211
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞