代码:
def add_bitwise(b1, b2):
'''Adds two binary numbers.'''
if b1 == '':
return b2
elif b2 == '':
return b1
else:
sum_rest = add_bitwise(b1[:-1],b2[:-1])
if b1[-1] == '0' and b2[-1] == '0':
return sum_rest + '0'
elif b1[-1] == '1' and b2[-1] == '0':
return sum_rest + '1'
elif b1[-1] == '0' and b2[-1] == '1':
return sum_rest + '1'
elif b1[-1] == '1' and b2[-1] == '1':
return sum_rest + add_bitwise(b2[:-1],'1') + '0'
所以我必须使这个函数接受两个二进制数并添加它们。这必须使用递归来完成,并且不能将数字转换为十进制,添加然后转换回二进制。所以我的基本情况说如果一个二进制数是空的,则返回另一个,反之亦然。然后对于我的递归调用,如果添加两个零,则返回0和递归调用。如果添加0和1,则添加一个和递归调用。
现在这里我被困住了。两个使得0然后你必须携带一个1到下一侧但我无法弄清楚如何在第二个递归调用中执行此操作。 Sum rest是正常的递归调用,然后是递归调用以携带数字,然后是0.函数必须保持设计但递归调用需要修复。
答案 0 :(得分:3)
您的溢出递归必须将'1'
与sum_rest
相加,而不是b2[:-1]
。溢出被转移到更高值的数字。
这是一个稍微缩短的实现:
def ab(b1, b2):
if not (b1 and b2): # b1 or b2 is empty
return b1 + b2
head = ab(b1[:-1], b2[:-1])
if b1[-1] == '0': # 0+1 or 0+0
return head + b2[-1]
if b2[-1] == '0': # 1+0
return head + '1'
# V NOTE V <<< push overflow 1 to head
return ab(head, '1') + '0'
例如,请考虑二进制文件'011'
和110
。您可以手动执行以下操作:
0 + 1 => 1
,保持1,无溢出1 + 1 => 10
,保持0,溢出0 + 1 + 1 => 10
,保持0,溢出/ + / + 1 => 1
,保持1,无溢出