Swift泛型类实现递归乘法方法报EXC_BAD_ACCESS错误如何解决
问题根因
你碰到的Thread 1: EXC_BAD_ACCESS (code=2)是无限递归引发栈溢出的典型报错,和泛型语法本身没有直接关系,是两个问题共同导致的:
- 你的递归乘法逻辑隐含了「第二个参数b是非负整数」的前提,没有覆盖所有合法输入场景:只要b是负数,
b - 1会让值持续变小,永远满足不了b == 0的终止条件;如果泛型T实例化为浮点数类型(比如Double、Float),只要b不是整数值,递归过程中b会直接跨过0变成负数,同样永远无法触发终止逻辑,最终栈帧占满内存空间抛出错误。 - 你之前非泛型版本能正常运行,只是因为测试时刚好只传入了正整数参数,刚好落在逻辑可正常终止的范围内,没有触发边界问题。
修复方案
你当前的实现逻辑是把乘法转换为b次累加,天然不支持非整数类型,修复时需要做三处调整:
- 把泛型约束从
Numeric收紧到SignedInteger,从类型层面排除浮点数这类不兼容的类型,同时支持正负整数运算 - 补充符号处理逻辑:如果b为负数,先把b转为正数递归计算,最终结果取反,避免负数场景无限递归
- 终止分支返回值用泛型类型自带的
.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
相关产品推荐
相关产品推荐

