递归算法
一、递归
1.定义
所谓递归,就是在不断调用自身的一种方法,字面意思就是递和归,递也就是一直传递数据,归就是传递到最后返回的过程,用代码来讲,递即传入一个数据,在经过一系列的“加工”后,返回出来的数值又进入到刚刚传入数据的那一步骤,并再次执行“加工”…
我们不妨想一个问题,这样的传递和返回的过程可以是连续的吗?
——————答案显然是否定的!
2.构成递归的条件
在算法的五个特性中,其中两个特性——有穷性,输出
一个函数如果无限执行下去,无法最终输出一个有意义的数值那么这个函数显然是毫无意义的,如果递归算法的内部是无穷的且无法输出一个有意义的值,显然违背了这两个特性。
条件:
- 子问题须与原问题相同。
- 不能无限制地调用本身,必须有个出口,将最终的值表达出来。
3.递归函数的流程图
4.现实中的一些递归
比如在两面相对的镜子间,从一个方向望去,们会从其中一面镜子里看到一个物体,物体后面又有一面镜子,镜子里面又有一个物体
又或者
二、简单的递归——求n的阶层
1.分析
总体分为两个步骤,一是设置这个函数的出口,二是利用代码和递归算法去实现它的功能。
————————————————————————————————
5的阶层是5* 4* 3* 2* 1,9的阶层是9* 8… * 2 *1,子问题和原问题一样,整个过程都是不断地在执行乘法,最终都是以乘1作为结束,故我们用1这个数来当作出口的条件,通过观察可以发现其中的规律(输入的数和输出的数始终相差1),故调用自身函数F(n-1),而最终的返回值便是n的阶层的值
2. 函数代码
long F(int n) {//阶层的数比较大,故用长整型
if (n == 1) {
return 1;//1的阶层是1
}
else {
return n*F(n - 1);//用递归函数求阶层
}
}
3.代码分析
先进行对n的判断,若n为1则直接返回1,否则进行递归
样例
5
流程
5 *F(4)
5 *4 *F(3)
5 *4 *3 *F(2)
5 *4 *3 *2 *1
输出
120
三、斐波那契数列
1.简介
公元 1202 年,一位意大利数学家莱昂纳多·斐波那契提出了具备以下特征的数列:
- 前两个数的值分别为 0 、1 或者 1、1;
- 从第 3 个数字开始,每个数的值是前两个数字之和;
人民为了纪念这位伟大的数学家,将满足这两个特征的数列称为斐波那契数列。
2.函数代码
int fibonacci(int n) {
if (n == 1 || n == 2) {
return 1;//逻辑运算符或
}
else {
return fibonacci(n - 1) + fibonacci(n - 2);//递归直接调用
}
//
}//由该数列性质推出,后一个数是前两个数之和(前提大于3)
3.代码分析
例如求fibonacci(5)
fibonacci(5)=fibonacci(4)+fibonacci(3)
其中
fibonacci(4)=fibonacci(3)+fibonacci(2)
fibonacci(3)=fibonacci(2)+fibonacci(1)
其中
fibonacci(3)=fibonacci(2)+fibonacci(1)
fibonacci(2)=2
fibonacci(1)=1
样例
5
输出
5
除此之外递归算法还可以用于其他很多问题,如**汉塔塔问题**等。