算法系列(十五) 循环和递归在算法中的应用

一、递归和循环的关系

1、 递归的定义

顺序执行、循环和跳转是冯·诺依曼计算机体 系中程序设计语言的三大基本控制结构,这三种控制结构构成了千姿百态的算法,程序,乃至整个软件世 界。递归也算是一种程序控制结构,但是普遍被认为不是基本控制结构,因为递归结构在一般情况下都可 以用精心设计的循环结构替换,因此可以说,递归就是一种特殊的循环结构。因为递归方法会直接或间接 调用自身算法,因此是一种比迭代循环更强大的循环结构。

2、 递归和循环实现的差异

循 环(迭代循环)结构通常用在线性问题的求解,比如多项式求和,为某一结果的精度进行的线性迭代等等 。一个典型的循环结构通常包含四个组成部分:初始化部分,循环条件部分,循环体部分以及迭代部分。 以下代码就是用循环结构求解阶乘的例子:

86 /*循环算法计算小数字的阶乘, 0 <= n < 10 */

87 int CalcFactorial(int n)   

88 {   

89     int result = 1;   

90    

91     int i;   

92     for(i = 1; i <= n; i++)   

93     {   

94         result = result * i;   

95     }   

96    

97     return result;   

98 }

递归方法通常分为两个部分:递归关系和递归终止条件(最小问题的解)。递归方法的关 键是确定递归定义和递归终止条件,递归定义就是对问题分解,是指向递归终止条件转化的规则,而递归 终止条件通常就是得出最小问题的解。递归结构与人类解决问题的方式类似,算法简洁且易于理解,用较 少的步骤就能描述解题的全过程。递归方法的结构中还隐含了一个步骤,就是“回溯”,对于需要“先进 后出”结构进行操作时,使用递归方法会更高效。以下代码就是用递归方法求解阶乘的例子:

100 /*递归算法计算小数字的阶乘, 0 <= n < 10 */

101 int CalcFactorial(int n)   

102 {   

103     if(n == 0) /*最小问题的解,也就是递归终止条件*/

104         return 1;   

105    

106     return n * CalcFactorial(n - 1); /*递归定义*/

107 }

从上面两个例子可以看出:递归结构算法代码结构简洁清晰,可读性强,非常符合“代码 就是文档”的软件设计哲学。但是递归方法的缺点也很明显:运行效率低,对存储空间的占用也比迭代循 环方法多。递归方法通过嵌套调用自身达到循环的目的,函数调用引起的参数入栈等开销会降低算法效率 ,同样,对存储空间的占用也体现在入栈参数以及局部变量所占用的栈空间。正因为这两点,递归方法的 应用以及解题的规模都受系统任务或线程栈空间大小的影响,在一些嵌入式系统中,任务或线程的栈空间 只有几千个字节,在设计算法上要慎用递归结构算法,否则很容易导致栈溢出而系统崩溃。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索数据结构算法
, 递归
, 结构
, 递归算法
, 循环
, 死循环?求解
, 循环问题
, 迭代
, c语言问题 新手求解
, 算法 递归 数据结构
, 阶乘
, 阶乘 算法
, 递归 循环
递归数据结构
循环赛日程表递归算法、java for循环递归算法、递归算法、递归算法经典实例、汉诺塔递归算法,以便于您获取更多的相关知识。

时间: 2024-11-17 00:51:42

算法系列(十五) 循环和递归在算法中的应用的相关文章

WorldWind系列十五:如何切割影像和DEM数据及其在WW中的应用配置

WorldWind学习系列十四中我从代码上分析如何加载DEM数据,里面涉及了算法,有学习和借鉴意义.但对于只求应用或者说是急于求成的网友来说,实用价值不是太大!我们分析代码是一种学习过程,不是目的,终究要落在如何应用自己的影像和DEM数据.如何基于自己的数据开发满足自己项目需求的新的WW插件.这是一过程,需要循序渐进,今天只跟大家分享一下如何切割自己的影像或DEM,及如何设置相应的XML配置. 我的学习和实践,主要是参考http://worldwindcentral.com/wiki/Dstil

算法系列(五)最长公共子序列(LCS)问题(非连续子序列)的两种解法

最长公共子序列也称作最长公共子串,英文缩写是LCS(Longest Common Subsequence).其定义 是:一个序列S,如果分别是两个或多个已知序列的子序列,且是符合此条件的子序列中最长的,则称 S为已知序列的最长公共子序列. 关于子序列的定义通常有两种方式,一种是对子序列没有连 续的要求,其子序列的定义就是原序列中删除若干元素后得到的序列.另一种是对子序列有连续的要 求,其子序列的定义是原序列中连续出现的若干个元素组成的序列.求解子序列是非连续的最长公共 子序列问题是一个十分实用的

AD数据库备份[为企业部署Windows Server 2008系列十五]

通过前面几篇文章的学习大家了解到了活动目录服务的部署,那么这次主要介绍windows server 2008下备份软件的安装以及如何备份活动目录数据库. 首先,windows server 2008中不再集成ntbackup工具了,而是使用windows server backup工具软件实现备份的,windows server backup(windows server 2008 中)是需要手动安装的. 安装:打开"服务器管理器",选择"功能",找到"w

【玩转数据系列十五】机器学习PAI为你自动写歌词,妈妈再也不用担心我的freestyle了(提供数据、代码)

背景 最近互联网上出现一个热词就是"freestyle",源于一个比拼rap的综艺节目.在节目中需要大量考验选手的freestyle能力,freestyle指的是rapper即兴的根据一段主题讲一串rap.freestyle除了考验一个人rap的技巧,其实我觉得最难的是如何在短时间内在脑海中浮现出有韵律的歌词. 本文会介绍如何自动生成歌词,到底什么工具有这样的功效呢?答案是PAI.PAI平台是阿里云人工智能平台,在上面可以通过最简单的拖拉拽的方式,完成对各种结构化以及非结构化数据的处理

MySQL---数据库从入门走向大神系列(十五)-Apache的DBUtils框架使用

DBUtils简介: commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能.因此dbutils成为很多不喜欢hibernate的公司的首选(嗯~商业竞争-..). commons-dbutilsAPI介绍: org.apache.commons.dbutils.QueryRunner org.apache.commons.dbutils.Res

算法系列(十三) 椭圆的生成算法

椭圆和直线.圆一样,是图形学领域中的一种常见图元,椭圆的生成算法(光栅转换算法)也是图 形学软件中最常见的生成算法之一.在平面解析几何中,椭圆的方程可以描述为(x – x0)2 / a2+ (y – y0)2 / b2 = 1,其中(x0, y0)是圆心坐标,a和b是椭圆的长短轴,特别的,当(x0, y0)就是坐标 中心点时,椭圆方程可以简化为x2 / a2 + y2 / b2 = 1.在计算机图形学中,椭圆图形也存在在点阵 输出设备上显示或输出的问题,因此也需要一套光栅扫描转换算法.为了简化,

【ANDROID游戏开发十五】关于ANDROID 游戏开发中 ONTOUCHEVENT() 触屏事件的性能优化笔记!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/336.html ----------------------- 『很多童鞋说我的代码运行后,点击home或者back后会程序异常,如果你也这样遇到过,那么你肯定没有仔细读完Himi的博文,第十九篇Himi专门写了关于这些错误的原因和解决方法,这里我在博客都补充说明下,省的童鞋们总疑惑这一块:请点击下面联系进入阅读:

redis之(十五)redis的集群中的哨兵角色

一:redis集群的哨兵的目的是什么?. (1)监控主redis和从redis数据库是否正常运行 (2)主redis出现故障,自动将其中一台从redis升级为主redis.将原先的主redis转变成从redis     二:redis集群+哨兵的的结构图 三单机模拟实现redis集群+哨兵的分布式部署 (1)启动redis集群 (2)查看集群角色 (3)启动哨兵(在配置文件中写入:sentinel monitor mymaster 127.0.0.1 6379 1) ==>配置文件格式:sent

ASP.NET 5系列教程 (五):在Visual Studio 2015中使用Grunt、Bower开发Web程序

基于Visual Studio 2015,你可以: 方便的管理前端包,如jQuery, Bootstrap, 或Angular. 自动运行任务,如LESS.JavaScript压缩.JSLint.JavaScript单元测试等. 方便的获得Web开发者生态圈的工具包. 为了实现这些场景,Visual Studio 2015已经内置了一些流行的第三方工具包: Bower:Web包管理器,Bower可以帮你安装前端包,包括JavaScript.CSS类库.对于服务器端包,请通过NuGet包管理. G