这是我得到的参考实现,令人困惑的是,我认为不需要递归。我在这里发布了代码和我的想法,任何见解都表示赞赏。如果我错了,请随时纠正我。
BTW,关于两个实现差异,请参阅第5行。感谢。问题是,是否需要递归?感谢。
参考实施,
1 int add_no_arithm(int a, int b) {
2 if (b == 0) return a;
3 int sum = a ^ b; // add without carrying
4 int carry = (a & b) << 1; // carry, but don’t add
5 return add_no_arithm(sum, carry); // recurse
6 }
我想到的另一个实现,
1 int add_no_arithm(int a, int b) {
2 if (b == 0) return a;
3 int sum = a ^ b; // add without carrying
4 int carry = (a & b) << 1; // carry, but don’t add
5 return sum ^ carry;
6 }
BTW,在Python中尝试了8 + 8为我工作,
a = 8
b = 8
sum = a ^ b
carry = (a & b) << 1
print sum^carry #16
提前谢谢,
林
答案 0 :(得分:3)
第二种方法不适用于1 + 3
。
以下是步骤
a == 01
b == 11
sum = a^b == 10
carry = (a&b) << 1 == 10
sum ^ carry == 00 // wrong answer! 1 + 3 == 4
仅仅在最后一步做^
是不够的,因为这笔钱可能会有进位。
答案 1 :(得分:2)
问题是,是否需要递归?
是的,确实如此。您可以通过尝试其他数字而不是仅仅8 + 8来自己看到这一点。例如,尝试21和15,没有递归,这会给出26的输出。
答案 2 :(得分:1)
如果没有二进制携带总和,则按位XOR运算符^
仅等效于加法运算符+
。如果有二进制携带,则它们不等同。例如,8 + 7
等于8 ^ 7
等于15
,但8 + 8
为16
而8 ^ 8
为0
。
即使你已经正确计算了sum-no-carry和carry-no-sum,如果加上这两个数字会产生二进制进位怎么办?然后,最后的^
运算符将不正确。如果没有+
运算符,我看到的唯一选项就是递归,添加这些数字。这将重复出现,直到其中一个数字为0。
示例:
add(no_arithm(18, 6))
sum = a^b
18 ^ 6是20
。carry = (a & b) << 1
18&amp; 6是2,左移位1是4
。return sum ^ carry
20 ^ 4是16
,不正确(18 + 6 = 24)。