Python 3.12.5设置递归上限仍报RecursionError,求F(n)计算方案
解决递归深度问题的方案
方案一:数学化简表达式(最优)
根据F(n)的递推公式:
F(n) = n*(n-1) + F(n-1) + F(n-2) (n>2)
我们可以逐步展开并化简目标表达式:
- 替换F(2024):
F(2024) = 2024*2023 + F(2023) + F(2022) - 替换F(2023):
F(2023) = 2023*2022 + F(2022) + F(2021) - 将F(2023)代入F(2024)的表达式,再代入目标式:
F(2024)-F(2022)-2*F(2021)-F(2020) = [2024*2023 + 2023*2022 + F(2022)+F(2021)+F(2022)] - F(2022) -2*F(2021) -F(2020) = 2023*(2024+2022) + F(2022) - F(2021) - F(2020) - 利用递推公式的变形
F(k) - F(k-1) - F(k-2) = k*(k-1)(k=2022),可得:
F(2022)-F(2021)-F(2020) = 2022*2021 - 最终化简计算:
原式 = 2023*(2024+2022) + 2022*2021 = 2023*2*2023 + 2022*2021 = 3*2023*2022 + 2 = 12271520
直接计算这个结果即可,无需调用任何函数。
方案二:迭代法计算F(n)(避免递归栈问题)
如果不想做数学化简,可以用迭代代替递归,从基础值开始逐步计算到目标项,代码如下:
def compute_F(n): if n == 1: return 1 if n == 2: return 2 a, b = 1, 2 # a=F(1), b=F(2) for k in range(3, n+1): c = k*(k-1) + a + b a, b = b, c return b # 计算目标表达式 result = compute_F(2024) - compute_F(2022) - 2*compute_F(2021) - compute_F(2020) print(result)
这个方法时间复杂度为O(n),空间复杂度为O(1),不会触发递归深度错误,运行速度远快于递归版本。
方案三:调整递归栈参数(不推荐)
如果坚持用递归,除了设置sys.setrecursionlimit,还可以尝试:
- 确认本地Python环境的递归栈限制确实能支持2024层(理论上2024远小于50000000,但部分环境可能存在隐性限制)
- 手动模拟尾递归逻辑(Python原生不支持尾递归优化,实用性较低)
显然前两种方案更可靠,尤其是数学化简方案,直接一步得到结果,效率最高。
内容的提问来源于stack exchange,提问作者Raven
相关产品推荐
相关产品推荐

