数据结构与算法课程报告-递归算法的原理与应用举例
时间:2025-02-21
时间:2025-02-21
数据结构与算法课程报告
递归算法的原理与应用举例
学号
姓名
班级 2011级电子2班
华侨大学电子工程系
一、 递归算法原理与介绍
1、递归算法的介绍与简要分析
递归是解决一类问题的重要方法。递归算法是算法设计中常用的一种方法,它可以解决具有递归属性的问题,并且是行之有效的。递归算法结构清晰,而且容易用数学归纳法来证明算法的正确性等优点,因此它为设计算法、调试程序带 来很大方便。我们先举一个简单的例子来说明。
我们知道,在数学中N!一般定义为:N=1*2*3*…*(N-1)*N 但也可以用下面公式来定义:{若N=0 N!=1;若N>0 N!= N*(N-1)!}
在N>0的公式中,又包括了(N-1)!,这就是N!的递归定义。
一般说,如果一个对象部分的有自己组成,或者是按他自己定义的,则称之为是递归的。 递归在数学和计算机学科中经常遇到。利用递归方法可以用有限的语句来定义无限集合,但在递归定义中至少要有一条是非递归的,即初始定义。否则就会产生逻辑性错误。
在计算机科学中,递归概念还经常用于递归调用方面,即函数或过程自己调用自己。用递归调用的算法就是递归算法。 递归调用会产生无终止运算的可能性,因此必须在适当的情况下终止递归调用(也叫做边界条件)。根据递归定义设计的递归算法中,非递归的初始定义就用做程序的终止条件。
递归算法就是算法中有直接或间接调用算法本身的算法。递归算法的要点是:
(1)递归就是在过程或函数里调用自身。 (2)问题具有类同自身的子问题的性质,被定义项在定义中的应用具有更小的尺度。 (3)被定义项在最小尺度上有直接解。 (4)在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口。
归算法设计的原则是用自身的简单情况来定义自身,一步比一步更简单,确定递归的控制条件非常重要。设计递归算法的方法是:
(1)寻找方法,将问题化为原问题的子问题的求解。 (2)设计递归出口,确定递归终止条件。
2.递归算法的特点
递归就是在过程或函数里调用自身 。 递归程序在执行过程中总是不断地调用自身, 而每次调用自身时, 通常在规模上都有所缩小, 当问题的规模缩小到某一值时就可以直接给出解答而不再进行递归调用,因而每次递归调用都是有条件的(以规模未达到直接解答的大小为条件), 而且相邻两次调用之间有紧密的联系, 前一次要为后一次做准备 (通常前一次的输出就作为后一次的输入), 在使用递归策略时, 必须有一个明确的递归结束条件, 也称为递归出口 。 递归算法一般用于解决三类问题:
(1)数据的定义是按递归定义的, 如 Fibonacci函数 。
(2)问题解法按递归算法实现, 如回溯问题 。
(3)数据的结构形式是按递归定义的, 如树的遍历, 图的搜索等 。
递归算法设计的基本思想是: 对于一个复杂的问题, 把原问题分解为若干个相对简单的同类子问题, 继续下去直到子问题简单到能够直接求解, 也就是说到了递归的出口, 这样原问题就有递推得解 。 所以在使用递归算法时, 首先要弄清楚简单情况下的解法, 然后弄清楚如何把复杂情况归纳为更简单的情况 。
3.递归算法的分类
递归算法一般通过函数或子过程来实现 。 在函数或子过程的内部,直接或者间接地调用自己的算法 。 所以根据递归算法的表示形式, 可以将递归算法分为递归函数和递归子过程两种; 根据递归算法调用的形式可以有直接递归和间接递归两种 。 如图所示是直接递归和间接递归调用过程的示意图 。
二、 递归算法的应用
(一) 汉诺塔问题
有三根针 A、B、c。A针上有,1个盘子,大的在下,小的在上,要求把这,1个盘子从A针移到 c针,在移动的过程中可以借助B针,每次只允许移动一个盘子,且在移动过程中在三根针上都保持 大盘在下,小盘在上。
关于这个递归问题的实例,教材与一般文献中都是直接介绍移动11,个盘子的算法。对学生来说,一个 不确定的数n,概念上太抽象,对算法的理解、依据算法编程带来很大难度。在教学过程中,笔者先从一个 确定的数字(n=3)来分析移动过程,模拟程序的执行过程。
假设 A针上有 3个(编号为 I、Ⅱ、Ⅲ)的盘子移到 C针上 ,现来看一下解决问题的步骤:
(1)将A针上2个(编号为 I、Ⅱ)盘子移到B针上(借助 c针):
1)将A针上 I号盘子移到c针上 2)将 A针上Ⅱ号盘子移到 B针上 3)将 C针上 I号盘子移到 B针上 (2)将A针上Ⅲ号盘子移到c针上。
(3)将B针上2个(编号为I、Ⅱ)盘子移到 c针上(借助A针):
1)将 B针上 I号盘子移到 A针上 2)将 B针上 Ⅱ号盘子移到 C针上 3)将 A针上 I号盘子移到 C针上
上述3个步骤中,(1)、(3)两步的解法与原来移动3个盘子的解法完全相同,只是盘子数目减少为 2,并且代表源针、工作针、目标针的针代号不同而已;问题
可以用递归方法解决,结束递归的条件就是 ,l= 1时,只需要简单地把一个盘子从源针移到目标针上即可。事实上,上面3个步骤包含两种操作:(1)将2 个盘子从一个针移到另一个针上,依据题意,每次移动过程都是一个对不同数目的盘子进行相 …… 此处隐藏:4365字,全部文档内容请下载后查看。喜欢就下载吧 ……
下一篇:需求分析文档模板