python函数(3)—— 递归

前面我们将了函数调用,那是一个函数调用另外一个函数,那我们能不能让函数调用它们自己呢?

函数作为一种代码封装,可以被其他程序调用,当然,也可以被函数内部代码调用。这种函数定义中调用函数自身的方式称为递归。

目录

一、定义:

二、递归思想

三、例题实操应用

1、求和(0~n)

2、求积(1~n)

3、实现斐波那契数列        这个数列从第3项开始,每一项都等于前两项之和

4、跳楼梯问题        一次走一阶或两阶楼梯 问走法几种:

5、不死兔子问题

6、汉诺塔问题:

三、总结:


一、定义:

        是指在函数的定义中使用函数自身的方法

        它至少有一个明确的递归结束的条件(否则就是一个死循环),能给出递归终止的处理方法,每次进入更深一层递归时,问题规模(计算量)相比上次递归都应有所减少。

二、递归思想

        1、找到递归关系(数列相邻几项直接的关系),将一个复杂问题转换为与之形式相似,但规模较小的问题

        2、找到递归出口,即问题转换时,当规模足够小,可直接求解

三、例题实操应用

1、求和(0~n)

def sum_num(n: int):
	# 递归一定要有终止条件,否则就是一个死循环
	if n == 0:
		return 0
	return n + sum_num(n - 1)


count = sum_num(100)
print(count)

2、求积(1~n)

def product_num(n: int):
	if n == 1:
		return 1
	else :
		return n * product_num(n - 1)


n = int(input("输入一个正整数"))
product = product_num(n)
print(f"1~{n}的积为{product}")

3、实现斐波那契数列        这个数列从第3项开始,每一项都等于前两项之和

def fibo(n: int) -> int: #返回值为int类型
	
	if n <= 2:
		return 1
	if n > 2 :
		return fibo(n-1) + fibo(n-2)


n = int(input("输入一个正整数"))
fibo_num = fibo(n)
print(f"斐波那契数列第{n}项的值为{fibo_num}")

4、跳楼梯问题        一次走一阶或两阶楼梯 问走法几种:

def jump_stair(n: int):
	if n == 1 or n == 2:
		return n
	else:
		return jump_stair(n-1)+jump_stair(n-2)


print(jump_stair(3))
print(jump_stair(10))

5、不死兔子问题

def rabbit(n):
	'''
		求不死神兔的数量,一对兔子四个月成熟期后生小兔子,
		之后每个月都会生一对小兔子,
		每一对小兔子过成熟期四个月之后还会再生小兔子,
		问 n 个月后兔子的对数的多少?

	'''
	if n <= 4:
		return 1
	else:
		return rabbit(n-1) +rabbit(n-4)
print(rabbit(14))

6、汉诺塔问题:

def tower(n):

	'''
		汉诺塔问题,
		(三根柱子,所有的块都在一根柱子上,其他两根柱子上没有块,且小块只能放在大块上)
		,问将一根柱子上的所有块全部移动到另一根柱子上的步数是多少?
	'''

	if n == 1:
		return 1
	else:
		return 2 * tower(n - 1) +1


n = int(input("请输入一个整数"))
move_count = tower(n)
print(f"要将{n}块移动到另外一根柱子上需要{move_count}步")

三、总结:

通过以上六个例题,我们能发现运用递归思路能很容易解决比较难处理的问题。

毕竟人无完人,递归也是有确定的,它不可能一直递归下去,并且当输入的值太大,递归次数太多时,python 都会报错。

为了避免“无限”调用导致堆栈溢出,python解释器会限制递归次数,默认可递归次数为1000(超过1000次就会报错,实际一般在996到998这个范围附近的次数就会报错)。

本文参考:【Python函数的递归】_python递归函数_W_chuanqi的博客-CSDN博客

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值