递归函数的限制

本文探讨了递归函数在达到最大递归深度时引发的RecursionError,以及递归过程中内存占用的变化。通过实例展示了即使在return语句后,递归函数的当前状态也不会立即释放,从而影响递归层数和时空限制。通过对代码的修改和内存占用的观察,揭示了递归函数在不同参数变化下的内存行为。

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

i=900
def a():
    global i
    i-=1
    s="我写这个函数是因为想到了些问题,例如之前写的递归函数,都是在函数中间,调用自身,获取数值,而这个函数,我其实是为了方便,如果遇到一个问题,就改变运行参数,于是需要重新调用这个函数,在新的参属下。其实这个用goto很爽,但是一方面是没有学到,另一方面goto貌似是个邪道,于是想尝试自己解决下。但即便是最后一句,使用的是return,那也算是递归?也就是说,调用新的一次函数的同时,当前函数没有被释放吗?"
    if i==0:
        input()
        return
    return a()
a()

4812KB内存占用,添加了S后,4896

问题一,递归深度限制

import sys   
sys.setrecursionlimit(100000) #例如这里设置为十万  

解决报错RecursionError: maximum recursion depth exceeded in comparison

我写这个函数是因为想到了些问题,例如之前写的递归函数,都是在函数中间,调用自身,获取数值,而这个函数,我其实是为了方便,如果遇到一个问题,就改变运行参数,于是需要重新调用这个函数,在新的参属下。其实这个用goto很爽,但是一方面是没有学到,另一方面goto貌似是个邪道,于是想尝试自己解决下。但即便是最后一句,使用的是return,那也算是递归?也就是说,调用新的一次函数的同时,当前函数没有被释放吗?

i=900
def a():
    global i
    i-=1
    s="我写这个函数是因为想到了些问题,例如之前写的递归函数,都是在函数中间,调用自身,获取数值,而这个函数,我其实是为了方便,如果遇到一个问题,就改变运行参数,于是需要重新调用这个函数,在新的参属下。其实这个用goto很爽,但是一方面是没有学到,另一方面goto貌似是个邪道,于是想尝试自己解决下。但即便是最后一句,使用的是return,那也算是递归?也就是说,调用新的一次函数的同时,当前函数没有被释放吗?"
    return
while 1:
    a()
    if i==0:
        input()
        break


3908KB内存占用 3952

即便添加了S这一个变量,两段代码增加的内存一样,那么

i=900
def a():
    global i
    i-=1
    s="我写这个函数是因为想到了些问题,例如之前写的递归函数,都是在函数中间,调用自身,获取数值,而这个函数,我其实是为了方便,如果遇到一个问题,就改变运行参数,于是需要重新调用这个函数,在新的参属下。其实这个用goto很爽,但是一方面是没有学到,另一方面goto貌似是个邪道,于是想尝试自己解决下。但即便是最后一句,使用的是return,那也算是递归?也就是说,调用新的一次函数的同时,当前函数没有被释放吗?"
    if i==0:
        input()
        return
    return a()
a()
i=900
def a():
    global i
    i-=1
    s="我写这个函数是因为想到了些问题,例如之前写的递归函数,都是在函数中间,调用自身,获取数值,而这个函数,我其实是为了方便,如果遇到一个问题,就改变运行参数,于是需要重新调用这个函数,在新的参属下。其实这个用goto很爽,但是一方面是没有学到,另一方面goto貌似是个邪道,于是想尝试自己解决下。但即便是最后一句,使用的是return,那也算是递归?也就是说,调用新的一次函数的同时,当前函数没有被释放吗?"
    if i==0:
        input()
        return
    a()
    return
a()

4912,多了一点,可能是因为内容一样,所以指针一样?那么字符串每次微小变化的话呢!?

i=900
def a():
    global i
    i-=1
    s="我写这个函数是因为想到了些问题,例如之前写的递归函数,都是在函数中间,调用自身,获取数值,而这个函数,我其实是为了方便,如果遇到一个问题,就改变运行参数,于是需要重新调用这个函数,在新的参属下。其实这个用goto很爽,但是一方面是没有学到,另一方面goto貌似是个邪道,于是想尝试自己解决下。但即便是最后一句,使用的是return,那也算是递归?也就是说,调用新的一次函数的同时,当前函数没有被释放吗?"+str(i)
    if i==0:
        input()
        return
    return a()
a()

i=900
def a():
    global i
    i-=1
    s="我写这个函数是因为想到了些问题,例如之前写的递归函数,都是在函数中间,调用自身,获取数值,而这个函数,我其实是为了方便,如果遇到一个问题,就改变运行参数,于是需要重新调用这个函数,在新的参属下。其实这个用goto很爽,但是一方面是没有学到,另一方面goto貌似是个邪道,于是想尝试自己解决下。但即便是最后一句,使用的是return,那也算是递归?也就是说,调用新的一次函数的同时,当前函数没有被释放吗?"+str(i)
    if i==0:
        input()
        return
    a()
    return 
a()



i=900
def a():
    global i
    i-=1
    s="我写这个函数是因为想到了些问题,例如之前写的递归函数,都是在函数中间,调用自身,获取数值,而这个函数,我其实是为了方便,如果遇到一个问题,就改变运行参数,于是需要重新调用这个函数,在新的参属下。其实这个用goto很爽,但是一方面是没有学到,另一方面goto貌似是个邪道,于是想尝试自己解决下。但即便是最后一句,使用的是return,那也算是递归?也就是说,调用新的一次函数的同时,当前函数没有被释放吗?"+str(i)
    return
while 1:
    a()
    if i==0:
        input()
        break

5336
5352
3928
这次递归明显比之前高出不少,确定。但是return 函数,这个在没有获得函数返回值前,是不会释放当前函数的。

所以递归的层数限制以及时空限制。

我在代码的最后边再加个input,完全递归展开和程序结尾,内存变化
5324 - 4812

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值