Recursion Cl0sed圆绘制简单

Recursion Cl0sed圆绘制简单,recursion,add,Recursion,Add,我正在尝试添加这两个二进制文件。我正在尝试编写一个函数,它将两个二进制数相加。我想让它加上一对比特。不过,我不知道如何携带这些多余的比特。以下是我编写的程序: 但是我的索引超出了范围,我不知道如何携带位。我一直在想,我应该第二次调用该函数,使用递归来添加位,但我不知道如何实现它。有人能告诉我如何编辑现有的代码,使其正常工作吗 def add_binary(s1, s2, carry=0): if not s1: if not carry: return s2

我正在尝试添加这两个二进制文件。我正在尝试编写一个函数,它将两个二进制数相加。我想让它加上一对比特。不过,我不知道如何携带这些多余的比特。以下是我编写的程序:

但是我的索引超出了范围,我不知道如何携带位。我一直在想,我应该第二次调用该函数,使用递归来添加位,但我不知道如何实现它。有人能告诉我如何编辑现有的代码,使其正常工作吗

def add_binary(s1, s2, carry=0):
    if not s1:
        if not carry: return s2
        else: return '1'*carry + s2
    if not s2:
        if not carry: return s1
        else: return '1'*carry + s1
    add = int(s1[-1])+int(s2[-1]) + carry
    carry = add and not add%2
    return add_binary(s1[:-1], s2[:-1], carry) + str(add%2)
输出:

In [16]: add_binary('10101', '10101')
Out[16]: '101010'

In [17]: add_binary('11', '')
Out[17]: '11'
编辑更明确的版本:

def add_binary(s1, s2):

    def sub(s1, s2, carry):
        if s1 != ""  or s2 != ""  or carry != 0:
            if s1 == "":
                s1 = "0"
            if s2 == "":
                s2 = "0"
            add1 = int(s1[-1]) + int(s2[-1]) + carry
            return sub(s1[:-1], s2[:-1], add1//2) + str(add1%2)
        else:
            return ""

    return sub(s1, s2, 0)

这里有一个相当不同的方法,似乎也适合问题陈述

digits = {('1','1'):'10',('1','0'):'01',('0','1'):'01',('0','0'):'00'}

def add_ones(d1d2):
  return digits[d1d2]

def add_binary(s1, s2):
  if not '1' in s1: return s2
  if not '1' in s2: return s1
  while (len(s1)>len(s2)):
    s1 = '0' + s1
  while (len(s2)>len(s1)):
    s2 = '0' + s2
  c = []  #carries
  p = ['0']  #places
  for d1d2 in zip(s1,s2):
      ci, pi = add_ones(d1d2)
      c.append(ci)
      p.append(pi)
  c.append('0')
  p = ''.join(p)
  c = ''.join(c)
  return add_binary(p,c)

@DonaldWang:这种方式更简洁,而且函数只能用一个参数调用。所以我不会太担心改变它further@DonaldWang:你为什么不试着玩弄一下我的代码,写一篇新文章或编辑你当前的文章,寻求进一步的帮助?@DonaldWang:我试了一会儿,但还是没能成功。因此我犹豫不决。此外,我真的需要回去工作了,这就是为什么我现在无法提供更多帮助的原因。这就是为什么我建议用新的尝试来写一篇新文章——这样比我聪明的人就可以帮上忙;]我认为这没有道理。我的解决方案的哪一部分不清楚或有问题?在每个递归中都有一个基本情况,它指定何时停止递归。这里,停止的条件是s1为空,s2为空,进位为0。但这在代码中看起来更笨拙,所以我颠倒了条件:如果s1不是“”,s2不是“”,或者carry不是0,那么请执行一些操作。好的,请查看我的更新。
digits = {('1','1'):'10',('1','0'):'01',('0','1'):'01',('0','0'):'00'}

def add_ones(d1d2):
  return digits[d1d2]

def add_binary(s1, s2):
  if not '1' in s1: return s2
  if not '1' in s2: return s1
  while (len(s1)>len(s2)):
    s1 = '0' + s1
  while (len(s2)>len(s1)):
    s2 = '0' + s2
  c = []  #carries
  p = ['0']  #places
  for d1d2 in zip(s1,s2):
      ci, pi = add_ones(d1d2)
      c.append(ci)
      p.append(pi)
  c.append('0')
  p = ''.join(p)
  c = ''.join(c)
  return add_binary(p,c)