携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第 29 天,点击查看活动详情
递归乘法
原题地址
递归乘法。 写一个递归函数,不使用 * 运算符, 实现两个正整数的相乘。可以使用加号、减号、位移,但要吝啬一些。
示例1:
输入:A = 1, B = 10
输出:10
示例2:
输入:A = 3, B = 4
输出:12
提示:
- 保证乘法范围不会溢出
思路分析
方法一
- 在上小学的时候,我们就知道乘法可以用加法来表示,因此一个作为循环次数,一个作为相加的数字进行循环相加即可;
- 提交运行测试用例时,竟然超出时间限制了,因此我们需要做些优化;
- 将 AB 中大的那个数字作为相加数字,小的那个数字作为循环次数后,成功通过用例。
方法二
- 方法二本质上与方法一类似,也需要寻找出 AB 中较大的数字和较小的数字;
- 使用递归的方式来计算最后的结果,首先确定递归终止条件,若循环次数为1时,返回相加的数字即可,因此每次讲循环次数减一进行递归即可得到结果。
AC 代码
方法一
/**
* @param {number} A
* @param {number} B
* @return {number}
*/
var multiply = function(A, B) {
let count = 0
const len = A > B ? B : A
const num = A > B ? A : B
for(let i = 0; i < len; i++) {
count += num
}
return count
};
结果:
- 执行结果: 通过
- 执行用时:52 ms, 在所有 JavaScript 提交中击败了93.98%的用户
- 内存消耗:41 MB, 在所有 JavaScript 提交中击败了15.28%的用户
- 通过测试用例:30 / 30
方法二
/**
* @param {number} A
* @param {number} B
* @return {number}
*/
var multiply = function(A, B) {
const len = A > B ? B : A
const num = A > B ? A : B
if(len === 1) return num
return num + multiply(len - 1, num)
};
结果:
- 执行结果: 通过
- 执行用时:64 ms, 在所有 JavaScript 提交中击败了31.02%的用户
- 内存消耗:41 MB, 在所有 JavaScript 提交中击败了14.81%的用户
- 通过测试用例:30 / 30