LeetCode 算法:递归乘法

169 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第 29 天,点击查看活动详情

递归乘法

原题地址

递归乘法。 写一个递归函数,不使用 * 运算符, 实现两个正整数的相乘。可以使用加号、减号、位移,但要吝啬一些。

示例1:

 输入:A = 1, B = 10
 输出:10

示例2:

 输入:A = 3, B = 4
 输出:12

提示:

  • 保证乘法范围不会溢出

思路分析

方法一

  1. 在上小学的时候,我们就知道乘法可以用加法来表示,因此一个作为循环次数,一个作为相加的数字进行循环相加即可;
  2. 提交运行测试用例时,竟然超出时间限制了,因此我们需要做些优化;
  3. 将 AB 中大的那个数字作为相加数字,小的那个数字作为循环次数后,成功通过用例。

方法二

  1. 方法二本质上与方法一类似,也需要寻找出 AB 中较大的数字和较小的数字;
  2. 使用递归的方式来计算最后的结果,首先确定递归终止条件,若循环次数为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

END