你能帮助我做到这一点吗?我在反向列表中有一个二进制表示的数字。伴随函数bn
可用于创建编码数字。
我想通过carry方法添加两个二进制数,但我无法正确使用,而且代码变得混乱。限制是人们只能在算法上使用布尔运算符和列表拼接。
# encode binary form of the number, not part of the algo
def bn (n):
return list(reversed(list(map(lambda x: 1 if x == "1" else 0, "{0:b}".format(n)))))
# main algo to sum two binary numbers
def s(m, n):
def _ (a, b, c):
if a and b:
return [0 if (0 if a[0] == b[0] else 1) == c else 1] + \
_(a[1:], b[1:], 1 if (c and (a[0] or b[0])) or (a[0] and b[0]) else 0)
if a:
return [0 if a[0] == c else 1] + ([1]+a[2:] if c else a[1:])
if b:
return [0 if b[0] == c else 1] + ([1]+b[2:] if c else b[1:])
return [1] if c else []
return _(m, n, 0)
print(bn(2017), bn(3), s(bn(2017), bn(3)), bn(2017+3))
此处为s(bn(2017), bn(3))
[0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1]
与bn(2017+3))
[0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1]
应该如此。
所以我请求帮助来纠正代码,加上你能做出的任何优化都会受到赞赏。
要测试基本情况,可以使用以下内容:
for i in range(0, 12, 2):
for j in range(0, 12, 3):
x, y = bn(i+j), s(bn(i), bn(j))
print(x == y, bn(i), bn(j), "%s + %s = %s %s -> %s" % (i, j, i+j, x, y))
但要注意,这并没有抓住我上面提到的2017 + 3的问题......