递归

递归

递归,就是函数直接或间接调用自己的一种算法。个人理解和数学中的数列相类似。递归的递推关系就是数列的递推公式,递归出口就相当于数列的首项,而递归的参数就相当于数列的项数。
下面先看例子:

第五个人说他比第四个人多两岁,第四个人说他比第三个人多两岁,第三个人说他比第二个人多两岁,第二个人说他比第一个人多两岁,第一个人说自己10岁。问:第五个人多少岁?

针对这个问题我们可以轻易地写出其递推关系。首先定义一个能够表示第n个人年龄的函数Age(n)。根据题意,我们能够得到:

Age(5)=Age(4)+2
Age(4)=Age(3)+2
Age(3)=Age(2)+2
Age(2)=Age(1)+2
Age(1)=10

观察上述表达式关系,我们能够得到最终的递归关系:

A g e ( n ) = { 10 x=1 A g e ( n − 1 ) + 2 x>1 Age(n)= \begin{cases} 10& \text{x=1}\\ Age(n-1)+2& \text{x>1} \end{cases} Age(n)={10Age(n1)+2x=1x>1

由此,我们就能写出递归算法,代码如下:

int  Age(int n)
{
	if(n == 1)
	{
		return 10;
	}
	else
	{
		return Age(n-1)+2;
    }
}

我们将主函数补充完整。并将5以参数形式传入,其最终结果为:
在这里插入图片描述
递归的实现离不开栈。在递归中,未完成的函数将会被放入栈中,针对每一个函数都存在一个指向其返回值的栈帧,下面,我们用图来描绘递归的过程:
在这里插入图片描述
将其形式化为:

==> Age(5)
==> Age(4) + 2
==> ( Age(3) + 2) + 2
==>( (Age(2) + 2) + 2 ) + 2
==>( ( (Age(1) + 2 ) + 2 ) + 2 ) + 2
==>( ( (10 + 2 ) + 2 ) + 2 ) + 2
==>( ( 12 + 2 ) + 2 ) + 2
==> ( 14 + 2 ) + 2
==> 16 + 2
==> 18

循环

每一个递归都能写成循环形式,如,上面那串代码的循环形式为:

int  Age(int n)
{
	int tmp=10;
	for(int i=1;i<n;i++)
	{
		tmp+=2;
	}
	return tmp;
}

相比递归来看,循环的运行时间和空间使用更少,效率更高,但是代码写起来比较麻烦,算法思路也不够清晰。

优化

为了减少递归的空间使用,提升效率,我们可以对递归进行优化,将其写成尾递归形式。其特点是在函数返回时只返回函数本身,其他的计算公式放到参数中实现。其代码如下:

int  Age(int n,int age)
{
	if(n==1)
	{
		return age;
	}
	else
	{
		return Age(n-1,age+2);
	}
}

将其栈形式化为:

==>Age(5,10)
==>Age(4,12)
==>Age(3,14)
==>Age(2,16)
==>Age(1,18)

其本质和循环相类似,只是形式上偏向递归。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值