2016-10-13 3 views
1

Code:Wie führe ich eine Ziffer, wenn binäre Addition durchgeführt wird?

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'  

Also muss ich diese Funktion machen, die zwei Binärzahlen nimmt und fügt sie. Dies muss unter Verwendung der Rekursion geschehen und kann die Zahlen nicht in Dezimalzahlen umwandeln, addieren und dann zurück in Binärwerte umwandeln. Meine Basisfälle sagen also, wenn eine Binärzahl leer ist, gebe die andere zurück und umgekehrt. Dann werden für meinen rekursiven Aufruf, wenn zwei Nullen hinzugefügt werden, 0 und der rekursive Aufruf zurückgegeben. Wenn eine 0 und eine 1 hinzugefügt werden, fügt es einen und einen rekursiven Aufruf hinzu.

Jetzt ist hier, wo ich feststecke. Zwei Einsen machen 0 und dann muss man eine 1 zur nächsten Seite tragen, aber ich kann nicht herausfinden, wie man das innerhalb des zweiten rekursiven Aufrufs macht. Sum rest ist der normale rekursive Aufruf, dann folgt der rekursive Aufruf, um die Ziffer zu tragen, und dann die 0. Die Funktion muss wie vorgesehen bleiben, aber der rekursive Aufruf muss fixiert sein.

Antwort

2

Ihre Überlaufrekursionen müssen sich zusammenaddieren '1' gegen sum_rest, nicht b2[:-1]. Der Überlauf wird auf die höherwertigen Stellen übertragen.

Hier ist eine etwas kürzere Umsetzung:

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' 

Zum Beispiel '011' und 110 die Binärdateien berücksichtigen. Sie würden die folgenden Operationen von Hand tun:

  • 0 + 1 => 1, halten 1, kein Überlauf
  • 1 + 1 => 10, halten 0, Überlauf
  • 0 + 1 + 1 => 10, halten 0, Überlauf
  • / +/+ 1 => 1, halten 1, Nr Überlauf
+0

Genau das, was ich gesucht habe! Vielen Dank! – jmcnuggsmagic13

Verwandte Themen