+
演算子なしでxとyの合計を取得する必要があります。
加算器を使用して2つの数値を合計しようとしました。xとxおよびy(x ^ y
)をxorした場合、キャリーなしの合計が得られます。 x & y
からキャリーを獲得できます。このキャリーを加算に追加するには、add関数を再度呼び出します。しかし、それは答えを与えません。私のコードのどこにエラーがあります。
def add(a,b):
if a == 0:
return b
return add(a^b, a&b)
x = 10
y = 20
print(add(10, 20))
エラー:
ファイル「main.py」、4行目、追加
return add(a^b, a&b) File "main.py", line 4, in add return add(a^b, a&b) File "main.py", line 4, in add return add(a^b, a&b) File "main.py", line 4, in add return add(a^b, a&b) File "main.py", line 4, in add return add(a^b, a&b) File "main.py", line 4, in add return add(a^b, a&b) File "main.py", line 4, in add return add(a^b, a&b) File "main.py", line 4, in add return add(a^b, a&b) File "main.py", line 4, in add return add(a^b, a&b) File "main.py", line 2, in add if a == 0: RuntimeError: maximum recursion depth exceeded in comparison
これは、onlyが無限ループに陥る理由を説明しています。提案された追加アルゴリズムには欠陥があります。正しい追加については Thierry Lathuille の回答も参照してください。
基本ケースの半分を忘れました:
def add(a,b):
if a == 0 or b==0: # if either one is zero
return a or b # return the non-zero one (or 0 if both are 0)
return add(a^b, a&b)
x = 10
y = 20
print(add(10, 20))
プリント
30 # this only works for some numbers, you algo is not correct, try add(3,2)
デバッグ:
def add(a,b):
print(f"a {bin(a):>10}")
print(f"b {bin(b):>10}")
if a == 0 or b==0:
return a or b
return add(a^b, a&b)
a 0b1010
b 0b10100
------------- # manually added the xor/and
xor 11110 # to show what happens:
and 00000 # b is 0
a 0b11110
b 0b0 # now it terminates as b is 0
2つの条件を逃しました。 b == 0の場合、aを返します。次に、キャリーもシフトします。
def add(a,b):
if a == 0:
return b
if b == 0:
return a
return add(a^b, a&b << 1)
x = 10
y = 20
print(add(10, 20))