算法基础篇(3)------递归与分治
来源:互联网 发布:短信猫测试软件 编辑:程序博客网 时间:2024/06/05 16:34
● 每周一言
渴望别人的理解,得先学会理解别人。
导语
一段递归代码,通常是简洁抽象的。如果说循环是一种横向的顺序遍历,递归就是一种纵向的来回遍历。而分治则吸取了递归的精华,是一种高效的递归法。那么,递归和分治的具体思想分别是什么?
递归
一个函数、过程、概念或数学结构,如果在其定义或说明内部又直接或间接地出现有其本身的引用,则称它们是递归的或者是递归定义的。在程序设计中,过程或函数直接或者间接调用自己,被称为递归调用。
递归可以划分为递推和回归两个阶段。问题逐层往前推进,这一过程叫做递推;子问题逐一解决,最后回到原问题,这一过程叫做回归。二者交替配合,就形成了递归。
采用递归编写的代码具有结构清晰,可读性强等优点,且递归算法的设计比非递归算法的设计往往更加简洁容易。所以当问题本身是递归定义的,或问题所涉及到的数据结构是递归定义的,或问题的解决方法为递归形式的时候,通常采用递归解决。经典的递归问题有上一篇中的快速排序以及八皇后、汉诺塔和全排列问题等。
当然,递归虽然有以上诸多优点,但仍然是一种低效的算法。其一,代码抽象容易出错;其二,程序很难调试。因此建议能用非递归实现的时候尽量用非递归实现,避免麻烦。
分治
分治就是“分而治之”的意思,其实质是将原问题分成n个规模较小而结构与原问题相似的子问题,然后递归地解这些子问题,最后合并结果得到原问题的解。
分治算法有两个适用条件:其一,大问题能分解成若干个独立的子问题;其二,每个子问题的求解过程都和大问题相似。这两个条件决定了分治的递归过程是受限的,通常能明确知道递归的终止条件及其每一层的逻辑,因此分治是一种高效的基本算法。比如上一篇中讲到的归并排序,用的就是分治法。这里我再展开讲一个经典的分治算法题:地毯填补。
题目描述: 相传在一个古老的阿拉伯国家里,有一座宫殿。宫殿里有个四四方方的格子迷宫,国王选择驸马的方法非常特殊,也非常简单:公主就站在其中一个方格子上,只要谁能用地毯将除公主站立的地方外的所有地方盖上,美丽漂亮聪慧的公主就是他的人了。公主这一个方格不能用地毯盖住,毯子的形状有所规定,只能有以下四种选择:
分治法的提示如下。敬请期待下节内容 贪心与动归。
结语
感谢各位的耐心阅读,后续文章于每周日奉上,欢迎大家关注小斗公众号 对半独白!
- 算法基础篇(3)------递归与分治
- 分治与递归算法
- 递归与分治算法
- 算法--递归与分治策略
- 递归与分治算法初步学习
- 算法复习-递归与分治策略
- 递归与分治算法实验报告
- 算法之浅谈递归与分治
- 算法时间复杂度----分治与递归
- 【算法·递归与分治】二分查找
- 算法复习2:递归与分治策略
- 棋盘覆盖递归与分治算法
- 重拾算法之路——递归与分治基础
- java递归分治算法
- acm算法基础2 递归,分治和贪心
- 五大基础算法(枚举、递归、分治、贪心、模拟)
- 算法设计与分析之递归与分治策略
- 递归与分治策略(一)---算法设计与分析
- IE8的不能显示
- 面向对象程序设计---16级
- c++ primer 练习 1.23、1.24
- volatile深入理解
- Dirt HDU - 3023 题解
- 算法基础篇(3)------递归与分治
- 三千烦恼丝
- Ubuntu 16.04 下安装 Tomcat (二进制)
- centos安装图形界面
- MIT 6.00 导论课程笔记(四)
- 控制台里从数组看到原型
- go 协程与主线程强占运行
- xcode模拟器关闭应用程序
- git学习—(6)每次提交需输入账号密码问题