递归算法详解

一、递归

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

除此之外递归算法还可以用于其他很多问题,如**汉塔塔问题**等。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

c语言15天菜鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值