函数递归

 

 

复制代码
 1 '''
 2 函数的递归即函数调用自己
 3 最佳实践:
 4     1. 定义基本情况(终止条件): 递归函数应该始终包含一个或多个基本情况,即终止条件。这些基本情况描述了递归的结束条件,当满足这些条件时,递归将停止并返回结果。
 5     2. 确保向基本情况收敛: 确保递归过程能够向基本情况无限接近,并最终收敛。如果递归没有向基本情况收敛,会导致无限递归,最终耗尽系统资源并引发错误。
 6     3. 传递必要的参数: 在每次递归调用中,确保传递必要的参数以便递归正确执行。参数的值应该在递归的不同层级中改变以推进问题的解决。
 7     4. 利用递归的结果: 在递归函数中合理利用递归的结果来构建最终的返回值。通常可以通过将递归结果与当前步骤的计算结果结合来获得所需的最终结果。
 8 
 9 需要注意的坑:
10     1. 缺少或错误的终止条件: 如果没有正确定义基本情况(终止条件),递归将无法结束,导致无限递归并耗尽系统资源。确保定义了满足停止递归的基本情况。
11     2. 递归层数过多: Python默认递归深度有限。如果递归的层数超过了Python的递归限制,将引发RecursionError。如果需要处理大量的递归,可能需要考虑使用其他方法,如迭代或动态规划。
12     3. 重复计算: 在递归函数中,如果没有适当地利用递归的结果,可能会导致重复计算相同的值,从而浪费时间和资源。确保适当地利用递归的结果以避免重复计算。
13     4. 栈溢出: 递归函数在每次递归调用时都会创建一个新的函数帧并将其推入调用栈中。如果递归层数过多,可能导致调用栈溢出并引发RecursionError。确保递归不会达到系统的调用栈限制。
14 '''
15 
16 
17 def factorial(n):
18     ''' n 表示要求的数的阶乘 '''
19     if n == 1 or n == 0:
20         return 1
21     else:
22         return n * factorial(n - 1)  # 返回结果
23 
24 
25 print(factorial(5))
复制代码
复制代码
# 需求:3以内数字累加和 3 + 2 + 1 = 6
# 6 = 3 + 2以内数字累加和
# 2以内数字累加和 = 2 + 1以内数字累加和
# 1以内数字累加和 = 1  # 出口


# 递归特点:函数内部自己调用自己;必须有出口


def sum_numbers(num):
    # 2. 出口
    if num == 1:
        return 1
    # 1. 当前数字 + 当前数字-1的累加和
    return num + sum_numbers(num-1)


result = sum_numbers(3)
print(result)

# 如果没有出口,报错:超出最大递归深度
复制代码

 

 

 

在Python中,默认的递归深度限制是1000层。这意味着,如果递归调用的层数超过了1000层,将引发RecursionError异常。

可以通过sys.setrecursionlimit()函数来更改默认的递归深度限制。例如,要将递归深度限制增加到2000层,可以使用以下代码:

1 import sys
2 
3 sys.setrecursionlimit(2000)

需要注意的是,更改递归深度限制可能会影响程序的性能和内存使用情况。如果需要处理大量的递归或者递归深度很大,建议考虑其他解决方案,如迭代或动态规划,以避免栈溢出或性能问题。

 

posted @   Allen_Hao  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示