【问题标题】:Recursive method to multiply two non-negative ints将两个非负整数相乘的递归方法
【发布时间】:2011-05-17 21:55:56
【问题描述】:

刚刚在过去的试卷中看到了这一点,并且正在寻找最好的方法,因为我无法弄清楚。我们的答案中不允许使用乘法,它必须使用重复加法。它还必须是递归的,而不是迭代的。

public static int add(int a, int b) {



}

谁能帮我解决这个问题? 非常感谢。

【问题讨论】:

  • 提示a + b等于a + 1 + 1 + 1...+ 1重复b次)
  • 您的方法名称是“add”,而您的主题是“multiply”,这是什么?
  • 它是乘法,使用递归加法。

标签: java recursion multiplication


【解决方案1】:
public static int add(int a, int b) {
    return a == 0 ? 0 : (add(a-1, b) + b);
}

【讨论】:

  • @Eng.Fouad 这就是规范。使其更通用可能会很有用,但这也可能会使 OP 过于复杂。
  • 抱歉,开头没看到“非负数”。
【解决方案2】:

如果允许换班和改装,这很有趣。

public static int add(int a, int b) {
    return a == 0 ? 0 : add(a >> 1, b << 1) + (a % 2 == 1 ? b : 0);
}

或(用 & 代替 mod):

public static int add(int a, int b) {
    return a == 0 ? 0 : add(a >> 1, b << 1) + (a & 1 == 1 ? b : 0);
}

【讨论】:

  • 这个只会递归 lg(a) 次。
【解决方案3】:

cidermonkey 写的是ancient Egyptian multiplication 的实现,至少在 3700 年前就被使用了。

例如,要乘以 27 * 37,写下两个数字并重复将第一个数字减半并将第二个数字加倍:

27   37
13   74
 6  148
 3  296
 1  592

然后,将第二列中第一列有奇数的数字相加:

37 + 74 + 296 + 592 = 999

这种方法今天仍然有效......数学就是这样。

【讨论】:

    猜你喜欢
    • 2018-07-16
    • 2022-07-28
    • 1970-01-01
    • 2017-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-29
    • 1970-01-01
    相关资源
    最近更新 更多