如何在不使用递归或/运算符的情况下用JavaScript实现除法功能
除法实现方案
你可以沿用乘法的实现思路,通过累计减去除数的方式统计商值,全程复用已实现的加减乘方法,不使用/运算符和递归,代码如下:
const division = (a, b) => { // 处理除数为0的异常 if (b === 0) throw new Error('除数不能为0'); // 确定结果符号:同号为正,异号为负 const sign = (a < 0) ^ (b < 0) ? -1 : 1; const absA = Math.abs(a); const absB = Math.abs(b); // 统计可以从被除数中减去除数的次数,即为商的绝对值 const quotient = [...Array(absA)].reduce((acc) => { if (acc.remaining >= absB) { return { count: adition(acc.count, 1), remaining: sustraction(acc.remaining, absB) }; } return acc; }, { count: 0, remaining: absA }).count; // 应用符号返回最终结果 return multiplication(quotient, sign); };
逻辑说明
- 符号判断用异或运算实现,仅当被除数和除数符号不同时结果为负
- 统一取绝对值计算,避免负数减法的逻辑干扰
- reduce 初始值携带两个状态:当前累计的商值
count、剩余未计算的被除数remaining,每次判断剩余值足够减除数时就更新状态,否则保持状态不变 - 所有计算逻辑都复用你已经实现的
adition、sustraction、multiplication方法,没有直接使用原生算术运算符,符合函数式编程的复用要求
效果测试
division(6, 2) // 返回 3 division(7, 2) // 返回 3(取整数商) division(-10, 2) // 返回 -5 division(-8, -4) // 返回 2
如果需要支持小数除法,需要额外扩展余数补0的逻辑,上述实现是通用的整数除法方案,完全符合你提的约束要求。
内容的提问来源于stack exchange,提问作者David Angarita
相关产品推荐
相关产品推荐

