如何修复递归函数溢出错误?

问题描述 投票:0回答:1

该程序旨在计算质子穿过铝时对 20000 片 0.025um 铝片的不同阻止本领。每个切片的停止本领都会发生变化,因此必须按每个切片计算停止本领和能量减法。即使在尝试增加递归限制后,我也会收到堆栈溢出错误。任何援助将不胜感激! distance(x,E,n) 具有变量 x(步长)、E(能量)和 n(停止本领)。所以距离(0,13000,0.13124)是初始步数、能量和制动力。此行后面的代码:

导入系统

sys.setrecursionlimit(10**9)

定义距离(x,E,n):

step = x + 1

if (step >= 20000):
    return E

energy = E - 0.025 * 1/n #E - distance interval per step * stopping power
stop = -0.0079199 + 0.040703 * energy**(-0.4) + 0.0022677 * energy**(0.25) + 0.000058309 * energy**(0.8) #1/stopping power


return distance(step,energy,stop)

打印(距离(0,13000,0.131234))

recursion stack-overflow physics
1个回答
0
投票

以20000的深度重复出现是不合理的。但是当你的递归调用出现在最后时,你可以将其转换为迭代解决方案 - 无需递归:

def distance(E, n):
    for _ in range(20000):
        E = E - 0.025 * 1/n #E - distance interval per step * stopping power
        n = -0.0079199 + 0.040703 * E**-0.4 + 0.0022677 * E**0.25 + 0.000058309 * E**0.8 #1/stopping power
    
    return E

print(distance(13000,0.131234))

我无法判断这个公式是否正确,但这是你的代码从递归方法到迭代方法的翻译。

© www.soinside.com 2019 - 2024. All rights reserved.