数值范围校验是防止溢出与崩溃的第一道防线,须在递归入口及每次调用前后对输入、中间值、索引、深度和浮点运算结果进行严格边界检查。

数值范围校验不是递归的“附加检查”,而是防止溢出与崩溃的第一道防线。它必须在每次递归调用前完成,尤其在参数参与算术运算(如乘、加、幂、阶乘、组合数)或作为数组/栈索引时。
递归入口处强制做输入边界检查
很多溢出源于初始参数就已越界,比如计算 factorial(100000) 或 fibonacci(-1)。应在函数最开始就拦截非法输入:
- 对有符号整数,检查是否在合理业务范围内(如时间戳不小于 0,ID 不超过 2^31−1)
- 对指数类递归(如
pow(x, n)),限制n绝对值上限(例如 ≤ 1000),避免中间结果爆炸式增长 - 拒绝负数阶乘、负数开方等数学无定义输入,直接返回错误码或抛异常,不进入递归体
递归调用前验证中间值是否安全
递归中常见模式是“当前值 = f(子问题结果)”,若子问题返回值过大,后续运算极易溢出。必须在调用后、使用前校验:
- 加法前:若
res = a + b,先判断b > INT_MAX - a(正数情形)或分符号检查 - 乘法前:若
res = a * b,用abs(b) > 0 && abs(a) > INT_MAX / abs(b)预判,或升到int64_t计算再回落 - 用作数组下标或内存偏移时,必须确保非负且
,否则不仅溢出还引发段错误
对深度敏感型递归增设层数熔断
栈溢出本质是调用帧累积过多,和数值大小无关但和递归深度强相关。仅靠数值校验无法覆盖此风险,需叠加深度控制:
- 在参数中显式传入当前层数
depth,每次递归前检查if (depth > MAX_DEPTH) return ERROR_OVERFLOW -
MAX_DEPTH不宜硬编码,应结合目标平台默认栈大小估算(如 Windows 默认 1MB,每层约 256B,则上限 ≈ 4000 层) - 对树遍历等结构化递归,可用“剩余栈空间探测”辅助(如 Linux 下
pthread_getattr_np获取栈剩余量),但更推荐保守预设
浮点递归中警惕指数级发散与精度塌缩
浮点数不会像整数那样“截断式溢出”,但 exp(x)、pow(10, x) 类递归极易触发 inf 或 0.0,进而导致除零、NaN 传播或逻辑失效:
- 在递归计算 softmax、logsumexp 等函数时,每轮都应平移输入:用
max_val归一化,确保指数项始终 ≤ 0 - 避免连续累乘小数(如概率链),改用对数空间运算:
log(p1 * p2 * ...)→log(p1) + log(p2) + ... - 当检测到
isnan()或isinf()时立即终止递归,不继续传递污染值










