Python使用" Elementary School"添加二进制数字。算法

时间:2017-02-26 17:58:13

标签: python recursion binary add

我必须编写一个代码,它接受两个输入二进制数字(作为字符串)并使用"小学和#34;添加它们。算法。这就是代码输入和输出应该是这样的:

>>>addBinary("11","1")
'100'

我自己尝试过写一些代码但是我被困了:

def addBinary(s,t, b = 0):
    if '' == s or '' == t:
        return s + t
    if 1 == len(s) or 1 == len(s):    
        if 0 == b:
            if (0 == s[-1] and 1 == t[-1]) or (1 == s[-1]and 0 == t[-1]):
                return addBinary(s[:-1],t[:-1]) + '1'
            elif 0 == s[-1] and 0 == t[-1]:
                return addBinary(s[:-1],t[:-1]) + '0'
            else:
                return addBinary(s[:-1],t[:-1],1) + '0'
        else:
            if (0 == s[-1] and 1 == t[-1]) or (1 == s[-1]and 0 == t[-1]):
                return addBinary(s[:-1],t[:-1],1) + '0'
            elif 0 == s[-1] and 0 == t[-1]:
                return addBinary(s[:-1],t[:-1]) + '1'
            else:
                return addBinary(s[:-1],t[:-1],1) + '0'

当我在字符串中留下1个元素时,我遇到了麻烦。我在创建我的基本案例时遇到了麻烦

PS:我必须为此代码使用递归。我不被允许使用循环。

3 个答案:

答案 0 :(得分:1)

一些问题:

  • 仅在s + t时返回b = 0,否则返回的值将不正确。
  • 当其中一个字符串有一个数字时,不需要特殊情况。
  • 但是,有必要处理其中一个字符串为空并且根据第一条规则无法使用s + t退出的情况。
  • 可以避免几次重复几乎相同的代码

有几种方法可以做到,但这里有一个:

def addBinary(s, t, carry = 0):
    if ('' == s or '' == t) and carry == 0:
        return s + t
    digit = carry
    carry = 0
    if s != '' and s[-1] == '1':
        carry = digit
        digit = 1 - digit
    if t != '' and t[-1] == '1': 
        carry += digit
        digit = 1 - digit
    return addBinary(s[:-1], t[:-1], carry) + str(digit)

请注意digit = 1 - digit只是将1翻转为0,将0翻转为1的方法。

答案 1 :(得分:0)

def add_binary(A:str,B:str)->str:
    result=[]
    carry=0
    i,j=len(A)-1,len(B)-1 # find the max index of strings
    while i>0 or j>0 or carry:
        total=carry # total is initially "carry" then we add values
        if i>=0:
            total+=int(A[i]) # convert the str to int, then add to "total"
            i-=1
        if j>=0:
            total+=int(B[j]) # same as above total operation
            j-=1
        result.append(str(total%2)) # if total=2, we write 0, if total=1, it is 1, if 0 it is 0
        carry=total//2 # if total=2 carry=1, otherwise carry=0
    # so far this is the first iteration
    return ''.join(reversed(result))

我们这样做 reversed(result) 因为“010101010”,我们从末尾开始求和,并将其推送到数组。所以二进制数字的最后一个元素相加并作为数组的第一个元素推送。这就是我们逆转它的原因。

答案 2 :(得分:-2)

作为旁注,最后两行应该是:

    else:
        return addBinary(s[:-1],t[:-1],1) + '1'

当长度为1时,您不应该做任何不同的事情。当其中一个长度为零时,您应该做一些不同的事情,并且在这种情况下您需要正确处理进位。 return s + tb时,1不正确。