可能存在无限递归_Python之递归函数

本文深入探讨了递归函数的概念,通过高斯求和的例子展示了递归的使用。递归函数在遇到基本情况时返回结果,否则不断解决规模更小的子问题。递归程序包括初始化、匹配基本条件、子问题定义、子问题解决和结果合并等步骤。同时,需要注意递归可能导致的栈溢出问题。此外,还给出了一个递归查找评论的示例,演示了递归在处理层级结构数据时的应用。
摘要由CSDN通过智能技术生成
a5c449e2a7d4c5ce610f8db3d9977def.png

我们在前面的章节中,很多次的看到了在函数中调用别的函数的情况,如果一个函数在内部调用了自身,这个函数就被称为递归函数。

高斯求和
def sum_number(n):
    total = 0
    for i in range(1, n+1):
        total += i
    return total


sum = sum_number(100)
print(sum)
但如果使用递归函数来写
def sum_number(n):
    if n <= 0:
        return 0
    return n+sum_number(n-1)


sum = sum_number(100)
print(sum)
分析一下代码

当n小于0的时候,直接给出和值为0,当n大于0时,结果是n加上sum_number(n-1)。这里的sum_number(n-1)又是一次sum_number函数的调用,不过参数的值变成了n-1,要得到sum_number(n)的值必须等待sum_number(n-1)的值被计算出来,同样要得到sum_number(n-1)的值必须等待sum_number(n-2)的值,如此一路推算下去,直到sum_number(0),因为if语句的存在,它不需要等待sum_number(-1)的计算了,而是直接给出结果0。然后程序一路返回,直到回到最初的sum_number(n),并给出最终结果。

核心思想

每一次递归,整体问题都要比原来减小,并且递归到一定层次时,要能直接给出结果。

每一个递归程序都要遵循相同的基本步骤:

  • 初始化算法,递归程序通常需要一个开始时使用的种子值,可以向函数传递参数,或者提供一个入口函数,这个函数是非递归的,但可以为递归计算设置种子值;
  • 检查要处理的当前值是否已经与基本条件相匹配,如果匹配,则进行处理并返回值;
  • 使用更小的或更简单的子问题(或多个子问题)来重新定义答案;
  • 对子问题运行算法;
  • 将结果合并入答案的表达式;
  • 返回结果。
例如:
lis = []
all_top_comments = ["顶级评论1", "顶级评论2", "顶级评论3", "..."]

def get_comment(comments):
    for comment in comments:
        lis.append(comment)
        # 假设有一个child方法获取当前评论的所有子评论
        child_comments = comment.child()
        # 如果有子评论的话,就递归查找下去,否则回退
        if len(child_comments) > 0:
            get_comment(child_comments)
            

get_comment(all_top_comments)

使用递归函数需要注意递归深度溢出,在Python中,通常情况下,这个深度是1000层,超过将抛出异常。在计算机中,函数递归调用是通过栈(stack)这种数据结构实现的,每当进入一个递归时,栈就会加一层,每当函数返回一层,栈就会减一层。由于栈的大小不是无限的,所以递归调用的次数过多,会导致栈溢出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值