You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL创建递归阶乘函数报错误码1424问题咨询

报错原因排查
  • 缺少递归终止边界判断:现有代码未对入参n做合法校验和终止判断,调用后会无限触发FactorialR(n-1)递归,即使开启递归权限也会最终栈溢出。
  • MySQL默认禁用存储程序递归:MySQL系统变量max_sp_recursion_depth默认值为0,禁止所有存储函数、存储过程的递归调用,直接触发1424错误。
可行实现方案

方案1:递归实现(需开启递归权限)

  1. 先执行命令开启递归支持,数值可根据阶乘计算需求调整,不建议设置过大避免内存溢出:
SET max_sp_recursion_depth = 100;
  1. 改写函数增加边界判断,完整代码如下:
DELIMITER //
CREATE FUNCTION FactorialR (n INT) RETURNS BIGINT
BEGIN
    -- 负数无合法阶乘返回NULL
    IF n < 0 THEN
        RETURN NULL;
    END IF;
    -- 递归终止条件:0!和1!均为1
    IF n <= 1 THEN
        RETURN 1;
    END IF;
    RETURN FactorialR(n-1) * n;
END//
DELIMITER ;

注意:INT类型最大仅支持到12!的计算,返回值改为BIGINT可支持到20!,超过该范围建议改用DECIMAL类型存储。

方案2:迭代实现(无需修改系统配置,稳定性更高)

不需要开启递归权限,也没有递归深度限制,适合生产环境使用:

DELIMITER //
CREATE FUNCTION FactorialI (n INT) RETURNS BIGINT
BEGIN
    DECLARE resultado BIGINT DEFAULT 1;
    IF n < 0 THEN
        RETURN NULL;
    END IF;
    WHILE n > 1 DO
        SET resultado = resultado * n;
        SET n = n - 1;
    END WHILE;
    RETURN resultado;
END//
DELIMITER ;

内容的提问来源于stack exchange,提问作者Zidane Ortiz Diaz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 17:45:07