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

未完全理解递归函数:关于Hack Reactor面试题的无乘号乘法实现

解析无乘法运算符的递归乘法函数

我来帮你拆解这个递归乘法函数的逻辑——它本质上是用加法+递归模拟乘法的核心:重复累加,还巧妙处理了负数的情况,比冗长的循环版本简洁太多了!

先把你找到的代码贴出来方便对照:

var output = multiply(4, 7);
function multiply(num1, num2) {
    if(num2 === 0) {
        return 0;
    }
    if(num2 > 0 ) {
        return (num1 + multiply(num1, num2-1));
    }
    if(num2 < 0 ) {
        return -multiply(num1, -num2);
    }
}
console.log(output); // 输出28

下面分三个部分拆解它的运行逻辑:

1. 递归的终止条件:处理乘0的情况

第一个if(num2 === 0)是递归的出口——任何数乘以0结果都是0,当num2减到0时,直接返回0,停止递归调用,避免无限循环。这是递归函数必须有的关键逻辑,没有它程序会一直调用自己直到栈溢出。

2. 正数相乘:转化为重复累加

当num2是正数时,函数执行return num1 + multiply(num1, num2-1),这一步把乘法拆成了“当前num1 + num1乘以(num2-1)”。

拿你的例子multiply(4,7)来追踪具体过程:

  • 第一次调用:4 + multiply(4,6)
  • 第二次调用:4 + multiply(4,5)
  • ...以此类推,直到num2变成0:
  • 最后一次调用:multiply(4,0)返回0
  • 然后开始回溯累加:4+4+4+4+4+4+4+0 = 28,正好是4*7的结果。

本质上就是把乘法转化成了num1累加num2次,递归帮你自动完成了循环累加的过程,不用手动写循环变量。

3. 负数相乘:转化为正数相乘再取反

当num2是负数时,函数执行return -multiply(num1, -num2)——因为负数乘法可以等价于“正数相乘的结果取负”。

举个例子,比如计算multiply(4,-2):

  • 因为num2=-2<0,所以先调用multiply(4,2)(把负数转成正数)
  • multiply(4,2)会返回4+4+0=8
  • 最后给这个结果取负,得到-8,也就是4*(-2)的正确结果。

如果num1是负数、num2是正数,逻辑也完全成立——因为加法本身会处理负数的累加,比如multiply(-3,4)就是-3 + (-3) + (-3) + (-3) = -12,结果正确。

这个函数的妙处在于用最少的代码覆盖了所有整数相乘的情况,把递归的特性用到了点子上,比循环版本更简洁易读!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:22:23