递归方法乘以两个非负的int

时间:2011-05-17 21:55:56

标签: java recursion multiplication

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

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



}

任何人都可以帮我解决这个问题吗? 非常感谢。

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

如果允许轮班和换档,这里很有趣。

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

或(使用&amp;而不是mod):

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

答案 2 :(得分:2)

cidermonkey编写的是ancient Egyptian multiplication的实现,并且至少在3700年前使用过。

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

27   37
13   74
 6  148
 3  296
 1  592

然后,在第二列中添加第一列中具有奇数的数字:

37 + 74 + 296 + 592 = 999

这种方法今天仍然有用......数学很好。