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

Swift泛型类实现递归乘法方法报EXC_BAD_ACCESS错误如何解决

问题根因

你碰到的Thread 1: EXC_BAD_ACCESS (code=2)是无限递归引发栈溢出的典型报错,和泛型语法本身没有直接关系,是两个问题共同导致的:

  • 你的递归乘法逻辑隐含了「第二个参数b是非负整数」的前提,没有覆盖所有合法输入场景:只要b是负数,b - 1会让值持续变小,永远满足不了b == 0的终止条件;如果泛型T实例化为浮点数类型(比如Double、Float),只要b不是整数值,递归过程中b会直接跨过0变成负数,同样永远无法触发终止逻辑,最终栈帧占满内存空间抛出错误。
  • 你之前非泛型版本能正常运行,只是因为测试时刚好只传入了正整数参数,刚好落在逻辑可正常终止的范围内,没有触发边界问题。
修复方案

你当前的实现逻辑是把乘法转换为b次累加,天然不支持非整数类型,修复时需要做三处调整:

  1. 把泛型约束从Numeric收紧到SignedInteger,从类型层面排除浮点数这类不兼容的类型,同时支持正负整数运算
  2. 补充符号处理逻辑:如果b为负数,先把b转为正数递归计算,最终结果取反,避免负数场景无限递归
  3. 终止分支返回值用泛型类型自带的.zero替代字面量0,更符合泛型编程规范,避免特殊整数类型的字面量转换异常

修复后的可运行代码:

class Math5<T: SignedInteger> {
    func multiplier(_ a: T, _ b: T) -> T {
        // 任意乘数为0直接返回0
        if a == .zero || b == .zero {
            return .zero
        }
        // 处理负数场景,统一转为正整数计算
        if b < .zero {
            return -multiplier(a, -b)
        }
        // 正整数场景逐次累加
        return a + multiplier(a, b - 1)
    }
}

补充说明:这个递归实现的时间复杂度是O(n),当b的绝对值很大时依然可能出现栈深度过高的问题,如果要用于生产环境建议替换为迭代实现,或者用位移优化的快速乘法逻辑;如果只是练习不用内置乘法的实现,上述代码已经可以解决你当前的报错,支持所有正负整数的乘法计算。

内容的提问来源于stack exchange,提问作者forginSpell

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 12:42:06