递归深度调大后触发0xC00000FD错误,该如何修复?
问题修复方案
错误原因
错误码0xC00000FD是栈溢出,递归计算F(2023)需要2023层递归调用,哪怕手动增大sys.setrecursionlimit,操作系统的线程栈容量也有上限,无法支撑这么深的递归层级。
最优解决方案:数学化简直接计算
其实完全不用计算完整阶乘,根据阶乘定义:F(n) = n × (n-1) × (n-2) × ... × 1F(n-3) = (n-3) × (n-4) × ... × 1
所以F(n)/F(n-3) = n × (n-1) × (n-2)
针对你的需求,直接计算2023 * 2022 * 2021即可,代码极简:
print(2023 * 2022 * 2021)
其他替代方案
如果需要通用计算F(n)/F(k)(n>k),可以用以下方法避免递归栈问题:
1. 循环实现阶乘
用循环替代递归,不会产生栈溢出:
def factorial(n): result = 1 for i in range(2, n+1): result *= i return result print(factorial(2023) / factorial(2020))
2. 使用Python内置math模块的factorial函数
math模块的factorial是C语言实现,效率高且不会有Python递归栈的问题:
import math print(math.factorial(2023) / math.factorial(2020))
3. 直接计算乘积(通用版)
对于F(n)/F(k),直接计算从k+1到n的乘积,比计算两个完整阶乘更高效:
def divide_factorial(n, k): if n <= k: return 1.0 if n == k else 0.0 result = 1 for i in range(k+1, n+1): result *= i return result print(divide_factorial(2023, 2020))
内容的提问来源于stack exchange,提问作者alexunder
相关产品推荐
相关产品推荐

