web-dev-qa-db-ja.com

pythonの+演算子なしの合計

+演算子なしで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
6
Asha105

これは、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
1
Patrick Artner

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))
1