【问题标题】:Cl0sed Circle Drawing Simple [closed]简单的Cl0sed圆形绘图[关闭]
【发布时间】:2014-10-10 21:13:52
【问题描述】:

我正在尝试添加这 2 个二进制文件。我正在尝试编写一个添加两个二进制数的函数。我试图让它添加一对位。我不确定如何携带额外的位。这是我编写的程序:

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

【问题讨论】:

    标签: recursion add


    【解决方案1】:
    def add_binary(s1, s2):
        def sub(s1, s2, carry):
            if s1 or s2 or carry:
                add1 = (int(s1[-1]) if s1 else 0) + (int(s2[-1]) if s2 else 0) + carry
                return sub(s1[:-1], s2[:-1], add1//2) + str(add1%2)
            else:
                return ""
        return sub(s1, s2, 0)
    

    EDIT更明确的版本:

    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)
    

    【讨论】:

    • 我认为这没有意义。我的解决方案的哪一部分不清楚或有问题?
    • 在每个递归中都有一个基本情况,它指定何时停止递归。这里,停止的条件是 s1 为空,s2 为空,进位为 0。但这在代码中看起来比较笨拙,所以我颠倒了条件:如果 s1 不是“”,或者 s2 不是“”,或者进位不为0,那就做点什么吧。
    • 好的,请看我的更新。
    【解决方案2】:
    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'
    

    【讨论】:

    • @DonaldWang:这样更简洁,并且可以只使用一个参数调用该函数。所以我不会太担心进一步改变它
    • @DonaldWang:你为什么不尝试一下我的代码,然后发布新帖子或编辑你当前的帖子,以寻求进一步的帮助?
    • @DonaldWang:我试了一小会儿,但还是没能成功。因此我犹豫不决。此外,我真的需要回去工作,这就是为什么我现在无法提供更多帮助。这就是为什么我建议用新的尝试来发一个新的帖子——这样比我聪明的人可以帮忙;]
    【解决方案3】:

    这是一种完全不同的方法,似乎也适合问题陈述。

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-20
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多