进行二进制加法时如何携带数字?

时间:2016-10-13 00:59:59

标签: python recursion binary addition

代码:

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.函数必须保持设计但递归调用需要修复。

1 个答案:

答案 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,无溢出