Python函数之:递归函数

本文深入探讨Python中的递归函数,强调递归必须有边界条件以防止无限循环。递归调用深度有限,超过限制会导致RecursionError。递归虽然简洁,但效率较低,尤其随着调用深度增加,可能导致栈内存溢出。通过实例讲解了如何使用递归解决阶乘、数的逆序打印和猴子吃桃问题。

函数执行流程:压栈 一层压一层

函数执行流程
函数流程2

递归Recursion:函数直接或者间接调用自身就是递归,递归需要有边界条件,递归前进段,递归返回段,递归一定一定要有边界条件,不然很容易崩溃

	#递归函数举例    计算斐波那契数列‘
		def fib(n):
			if n < 3:					#这里就是递归的边界  当n小于5就return退出
				return 1
			return fib(n-1) + fib(n-2)	#这里就是自己调用自己 一层层下去  到底然后一层层返回
		print(fib(5))					# 打印  5			n传的数如果很大效率就很慢

递归要求:递归一定要有退出条件,递归调用一定要执行到条件退出。如果没有退出条件的递归调用,就是无限调用,直到崩溃

递归调用的深度不宜过深,python对递归调用的深度做了限制,用以保护解释器,当递归调用超过深度限制时,就会抛出RecursionError:maxinum recursion depth exceeded 超出最大深度的错误
调用import sys 用sys.getrecursionlimit()可以查看解释器最大的调用深度

递归的性能:循环稍微复杂一些,但是只要不是死循环,可以多次迭代直到算出结果,斐波那契函数的代码极简易懂,但是只能回去最外层的函数调用,而且给定一个n都要进行近2n次的递归,递归调用深度越深,效率越低,递归还有深度限制,如果递归复杂,函数反复压栈,栈内存很快就会溢出

递归总结:

总结

递归的练习题:

第一:用递归求n的阶乘

def fn(n):
	if n == 1:			#递归的边界条件
		return 1
	return n * fn(n - 1)		#递归进去计算  自己调用自己
print(fn(5))

第二:将一个数逆序打印

def rev(x, tar = None):
	if tar == None:			#判断tar是不是None 如果是 则追加一个空列表
		tar = []
	x, y = divmod(x, 10)		# 这里的divmod作用是 x / 10    然后x, y 解构 x拿到商(1234) y拿到余数(5)
	tar.append(y)				#将5追加进列表
	if x == 0:
		return tar
	return rev(x, tar)
print(rev(12345))				#传入12345

第三:解决猴子吃桃问题

def fn(n):			
	if n == 1:
		return 1
	return (fn(n-1)+1) * 2
print(fn(10))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值