1.算法设计的基本方法(二)

自古美人都是妖i 提交于 2020-02-13 02:09:06

续上一篇继续写算法设计的基本方法,递推法和递归法

3.递推法

其基本思想就是从前面的一些量推出后面的一些量,它从已知的初始条件出发,逐次推出所要求解的各中间结果和最终结果。
具体实现有两种方式:递归的和非递归的

  1. 递归的递推求解是使用迭代法计算,自顶向下进行;
  2. 非递归的地推求解是使用迭代法计算,自底向上。

[例1-16]计算斐波那契数。斐波那契数列存在着如下递推关系:f(0)=0,f(1)=1,f(n)=f(n-1)+f(n-2),n≥2

程序如下:

int Fib(int k){
	if(k<2)return k;
	int f0,f1,i,fk;
	f0=0,f1=1;
	for(int i=2;i<=k;i++){
		fk=f0+f1;
		f0=f1;f1=fk;
		}
		return fk;
	}	

4.递归法

如果一个数据对象包含它自身,则称此对象为递归的;
如果一个过程直接或间接调用它自身,则该过程是递归的。
直接调用自身称作直接递归,间接调用就称间接递归呗!

递归是构造算法的一种基本方法,它将一个复杂问题归结为若干个较为简单的问题,然后将这些较为简单问题进一步归结为更简单的问题,这个过程一直进行下去,直到归结为最简单的问题为止,这个最简单的问题即为递归终止条件,也称作递归出口

后续章节介绍的许多算法都可以用递归法实现,虽然可能效率不高,但它简单、易于实现,如汉诺塔(Hanoi)、八皇后、迷宫等问题。许多数据结构本身就是递归的,如树和二叉树;还有许多数据结构的实现是递归的,如链表、邻接表等。

递归和递推是既有区别又有联系的两个概念。

  1. 递推是从已知初始条件出发逐次推出最后所求的值;
  2. 递归则是首先确定可以直接求解的情况和问题解,然后从问题规模为n的场合把问题划分,通过调用其本身求解过程降低问题规模,直到可以直接求值的递归出口出现,然后再倒推回来得到最终的值。

一般来说,一个递推算法总可以转换为一个递归算法。

[程序1-18]计算斐波那契数的递归算法。

int Fib(int k){
	if(k<2)return k;
	else return Fib(k-2)+Fib(k-1);
}	

对于同一问题所设计的递归算法往往要比非递归算法付出更多执行时间代价和更多的辅助存储空间开销。

但是呢,利用递归方法分析和设计算法可使难度大幅度下降,且程序设计语言中一般都提供递归机制;利用递归过程描述问题求解算法不仅非常自然,而且算法的正确性证明要比相应的非递归算法容易得多;另外有成熟的方法和技术,可以很方便地把递归算法改写为非递归算法。

所以,递归技术是算法设计的基本技术,递归方法是降低分析设计难度提高设计效率的重要手段和工具。

余国煜 [200212]

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!