未完全理解递归函数:关于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
相关产品推荐
相关产品推荐

