python函数(3)—— 递归

文章介绍了函数递归的概念,即函数在其定义中调用自身,通过递归思想解决复杂问题。提供了多个递归应用的Python代码示例,如求和、求积、斐波那契数列、跳楼梯问题、不死兔子问题和汉诺塔问题,强调了递归必须有终止条件以防止死循环,并提到Python解释器对递归深度的限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

目录

一、定义:

二、递归思想

三、例题实操应用

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的博客-优快云博客

### Python 函数递归的原理 函数递归是一种通过在函数内部调用自身来解决问题的技术。其核心在于将复杂问题分解成更简单的子问题,直到达到可以直接求解的基础情况为止[^1]。 #### 关键概念 - **链条**:指递归过程中的逻辑链路,即每次递归调用如何逐步接近基础情况。 - **基例**:也称为终止条件,是指无需进一步递归即可直接返回结果的情况。缺少基例可能导致无限递归,最终引发栈溢出错误。 --- ### 示例分析 #### 实例一:斐波那契数列 斐波那契数列是一个经典的递归应用场景。定义如下: \[ F(n) = \begin{cases} 0 & \text{if } n=0 \\ 1 & \text{if } n=1 \\ F(n-1) + F(n-2) & \text{otherwise} \end{cases} \] 以下是实现代码: ```python def fibonacci(n): if n == 0: # 基例1 return 0 elif n == 1: # 基例2 return 1 else: return fibonacci(n - 1) + fibonacci(n - 2) print(fibonacci(7)) ``` 上述代码展示了递归的核心思想——通过不断缩小问题规模直至到达基例。 为了优化性能,可以通过引入缓存机制减少重复计算。例如: ```python def fibonacci_inner(n, cache={}): if n in cache: # 利用缓存避免重复计算 return cache[n] if n == 0 or n == 1: result = n else: result = fibonacci_inner(n - 1, cache) + fibonacci_inner(n - 2, cache) cache[n] = result # 将结果存储到缓存中 return result print(fibonacci_inner(50)) ``` 这种方法显著提高了效率[^2]。 --- #### 实例二:倒序打印字符串 另一个简单例子是使用递归来反转字符串。假设输入字符串 `s`,则可以将其拆分为首字符和剩余部分,并对后者继续处理。 ```python def reverse_string(s): if s == "": # 基例 return "" else: return reverse_string(s[1:]) + s[0] print(reverse_string("hello")) ``` 此代码利用递归逐层剥离字符串的第一个字符并重新组合[^3]。 --- ### 性能注意事项 尽管递归简洁优雅,但在某些情况下可能带来性能开销。这是因为每层递归都会增加一次函数调用记录,占用额外内存空间。对于大规模数据集或深层嵌套场景,建议考虑迭代或其他替代方法[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值