【发布时间】:2014-10-10 21:13:52
【问题描述】:
我正在尝试添加这 2 个二进制文件。我正在尝试编写一个添加两个二进制数的函数。我试图让它添加一对位。我不确定如何携带额外的位。这是我编写的程序:
但我的索引超出范围,我不确定如何携带位。我一直在想我应该使用递归再次调用该函数以添加位,但我不知道如何实现它。谁能告诉我如何编辑我现有的代码以使其正常工作。
【问题讨论】:
我正在尝试添加这 2 个二进制文件。我正在尝试编写一个添加两个二进制数的函数。我试图让它添加一对位。我不确定如何携带额外的位。这是我编写的程序:
但我的索引超出范围,我不确定如何携带位。我一直在想我应该使用递归再次调用该函数以添加位,但我不知道如何实现它。谁能告诉我如何编辑我现有的代码以使其正常工作。
【问题讨论】:
def add_binary(s1, s2):
def sub(s1, s2, carry):
if s1 or s2 or carry:
add1 = (int(s1[-1]) if s1 else 0) + (int(s2[-1]) if s2 else 0) + carry
return sub(s1[:-1], s2[:-1], add1//2) + str(add1%2)
else:
return ""
return sub(s1, s2, 0)
EDIT更明确的版本:
def add_binary(s1, s2):
def sub(s1, s2, carry):
if s1 != "" or s2 != "" or carry != 0:
if s1 == "":
s1 = "0"
if s2 == "":
s2 = "0"
add1 = int(s1[-1]) + int(s2[-1]) + carry
return sub(s1[:-1], s2[:-1], add1//2) + str(add1%2)
else:
return ""
return sub(s1, s2, 0)
【讨论】:
def add_binary(s1, s2, carry=0):
if not s1:
if not carry: return s2
else: return '1'*carry + s2
if not s2:
if not carry: return s1
else: return '1'*carry + s1
add = int(s1[-1])+int(s2[-1]) + carry
carry = add and not add%2
return add_binary(s1[:-1], s2[:-1], carry) + str(add%2)
输出:
In [16]: add_binary('10101', '10101')
Out[16]: '101010'
In [17]: add_binary('11', '')
Out[17]: '11'
【讨论】:
这是一种完全不同的方法,似乎也适合问题陈述。
digits = {('1','1'):'10',('1','0'):'01',('0','1'):'01',('0','0'):'00'}
def add_ones(d1d2):
return digits[d1d2]
def add_binary(s1, s2):
if not '1' in s1: return s2
if not '1' in s2: return s1
while (len(s1)>len(s2)):
s1 = '0' + s1
while (len(s2)>len(s1)):
s2 = '0' + s2
c = [] #carries
p = ['0'] #places
for d1d2 in zip(s1,s2):
ci, pi = add_ones(d1d2)
c.append(ci)
p.append(pi)
c.append('0')
p = ''.join(p)
c = ''.join(c)
return add_binary(p,c)
【讨论】: