小甲鱼《零基础学习Python》课后笔记(二十二):函数——递归是神马

测试题
0.递归在编程上的形式是如何表现的呢?
递归形式上就是在函数体里调用自身。如下所示:

def fun():
	return fun()

不过这样是不行的,因为没有停止条件,IDLE会一直报错,直到你按下Ctlr + C。python3默认递归的深度是100层,可以通过以下代码修改:

>>> import sys
>>> sys.setrecursionlimit(1000)
1.递归必须满足哪两个基本条件?

递归需要满足:调用自身;有停止条件。

2.思考一下,按照递归的特性,在编程中有没有不得不使用递归的情况?

例如汉诺塔,目录索引(因为你不知道目录里是否还有目录),树结构的定义等.

3.用递归去计算阶乘问题或斐波那契数列是很糟糕的算法,你知道为什么吗?

因为递归是函数调用自身,每一次调用都要进行压栈和出栈,需要很多时间和内存资源。

4.请聊一聊递归的优缺点(无需官方陈词,想到什么写什么就可以)

优点:可以使代码简洁;在解决一些问题,如汉诺塔问题时比较方便
缺点:使用上需要谨慎,因为会占用大量时间和资源;还有可能因为停止条件设置不合适而导致内存爆满。


5.拿手机拍一张“递归自拍照片”

拍这个的话需要两面镜子,那会是一个没有停止条件的递归,无限循环反射下去。

动动手

0.使用递归编写一个power()函数内建函数pow(),即power(x,y)为计算并返回x的y次幂的值。

def power(x,y):
	if y > 0:
		return x*power(x, y-1)
	else:
		return 1

测试代码及结果:

>>> for x in range(2,6):
	for y in range(6):
		print(pow(x,y) == power(x,y), end = "\t")

		
True	True	True	True	True	True	True	True	True	True	True	True	True	True	True	True	True	True	True	True	True	True	True	True	

1.使用递归编写一个函数,利用欧几里得算法求最大公约数,例如gcd(x,y)返回值为参数x和参数y的最大公约数。

def gcd(x,y):
	if y > 0:
		yushu = x%y
		x = y
		y = yushu
		return gcd(x,y)
	else:
		return x

测试代码及结果:

>>> for x in range(1,6):
	for y in range(10,16):
		print('%d,%d最大的约数是:%d' %(x,y,gcd(x,y)))

		
1,10最大的约数是:1
1,11最大的约数是:1
1,12最大的约数是:1
1,13最大的约数是:1
1,14最大的约数是:1
1,15最大的约数是:1
2,10最大的约数是:2
2,11最大的约数是:1
2,12最大的约数是:2
2,13最大的约数是:1
2,14最大的约数是:2
2,15最大的约数是:1
3,10最大的约数是:1
3,11最大的约数是:1
3,12最大的约数是:3
3,13最大的约数是:1
3,14最大的约数是:1
3,15最大的约数是:3
4,10最大的约数是:2
4,11最大的约数是:1
4,12最大的约数是:4
4,13最大的约数是:1
4,14最大的约数是:2
4,15最大的约数是:1
5,10最大的约数是:5
5,11最大的约数是:1
5,12最大的约数是:1
5,13最大的约数是:1
5,14最大的约数是:1
5,15最大的约数是:5
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值