刚刚在过去的试卷中看到了这一点,我正在寻找最佳方法,因为我无法弄明白。我们不允许在我们的答案中使用乘法,它必须使用重复添加。它也必须是递归的而不是迭代的。
public static int add(int a, int b) {
}
任何人都可以帮我解决这个问题吗? 非常感谢。
答案 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
这种方法今天仍然有用......数学很好。