小甲鱼《零基础学习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

猜你喜欢

转载自blog.csdn.net/qq_24546137/article/details/81463308