2016-10-13 60 views
1

代碼:如何進行二進制加法時輸入數字?

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.該函數必須按設計保持,但遞歸調用需要固定。

回答

2

您的溢出遞歸必須總結'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,無溢出
+0

正是我在找的東西!謝謝! – jmcnuggsmagic13