【OJ】运行时错误(Runtime Error)导致递归爆栈问题

在进行OJ赛时,
题目:给你一个整数n,问最多能将其分解为多少质数的和。在第一行输出最多的质数数量k,下一行输出k个整数,为这些质数。
在这里插入图片描述

出现运行时错误
在这里插入图片描述
代码如下:

def main():
    # code here
    n = int(eval(input()))
    list = []
    for i in range(2, n + 1):
        if i == 2:
            list.append(i)
        for j in range(2, i):
            # i除以2到i-1之间的数,寻找素数2
            if i % j == 0:
                break
            else:
                list.append(i)
                break
    num = 0  # 统计数量
    currentValue = 0  # 当前的值
    currentList = [] #统计构成当前输入数字的质数
    Sum(currentValue, list, n,currentList)
    num=len(currentList)
    print(num)
    print(' '.join(str(i) for i in currentList))
    pass


def Sum(currentValue, list, n,currentList):
    for i in list:
        if currentValue< n:
            if currentValue+i<n:
                currentValue+=i
                currentList.append(i)
                Sum(currentValue, list, n,currentList)
                break
            if currentValue+i==n:
                currentList.append(i)
                break
            else:
                currentValue-=i
                currentList.remove(i)

if __name__ == '__main__':
    main();

程序并没有错误,在pycharm上面能够运行出结果,在马蹄集上面测试也没有问题,一提交就出错。
在这里插入图片描述
在这里插入图片描述
结论:反复运行测试,发现问题,应该是出现递归上,当输入n值足够大时,会出现n/2+1左右次递归,内存直接爆了,即递归爆栈(一般由递归时层数过深导致的)。测试用例太小了,导致未发现问题,需要修改递归代码。如下图所示:
RecursionError: maximum recursion depth exceeded in comparison
RecursionError:在比较中超过了最大递归深度
在这里插入图片描述
去掉递归,修改Sum函数为如下:
在这里插入图片描述

def main():
    # code here
    n = int(eval(input()))
    list = []
    for i in range(2, n + 1):
        if i == 2:
            list.append(i)
        for j in range(2, i):
            # i除以2到i-1之间的数,寻找素数2
            if i % j == 0:
                break
            else:
                list.append(i)
                break
    num = 0  # 统计数量
    currentValue = 0  # 当前的值
    currentList = [] #统计构成当前输入数字的质数
    Sum(currentValue, list, n,currentList)
    num=len(currentList)
    print(num)
    print(' '.join(str(i) for i in currentList))
    pass


def Sum(currentValue, list, n,currentList):
    while currentValue< n:
        for i in list:
            while currentValue+i<n:
                currentValue+=i
                currentList.append(i)
            if currentValue+i==n:
                currentList.append(i)
                break
            elif currentValue+i>n:
                currentValue-=i
                currentList.remove(i)
        break

if __name__ == '__main__':
    main();

提交通过
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值