【问题标题】:getting zeros from an integer using python recursion使用python递归从整数中获取零
【发布时间】:2022-01-09 21:18:03
【问题描述】:

我想从一个数字中提取所有的零,并使用 Python 递归找到零的长度。我已经尝试了以下代码,但它给了我一个错误。我可以使用 for 循环来做到这一点,但我想知道 python 递归是如何做到这一点的。此代码输出应为 3。

def zeros(n):
    x = list(str(n))
    if x == []:
        return []
    else:
        head = x[0]
        tail = "0"
        return len([head]) + zeros(tail)


print(zeros(10010))

RecursionError: 调用 Python 对象时超出最大递归深度

【问题讨论】:

  • 我认为 tail 应该是 x[1:],而不是 "0"

标签: python recursion


【解决方案1】:

因为在第一个循环之后, head 总是一个标量值(数字),而 tail 总是 0 ,所以你的逻辑的 else 部分总是运行并且没有逻辑停止特定条件的递归,最终它命中您收到的错误消息的递归限制。

您可以通过这种方式轻松计算数字中出现零的次数:

print(str(10010).count('0'))

你真的不需要递归来解决这个问题。

【讨论】:

    【解决方案2】:

    如果出于某种原因,您不喜欢已经建议的使用 count 的简单性,并且真的想使用递归,则以下代码可以使用:

    def zeros(n):
        n = str(n)
        if not len(n): 
            return 0
        elif n[0] == '0':
            return 1 + zeros(n[1:])
        else:
            return zeros(n[1:])
    

    【讨论】:

      【解决方案3】:

      不需要字符串,只需要算术:

      def zeros(n):
          if n == 0:
              return 1
          else:
              if n < 0:
                  n = -n
              nb_zeros = 0
              while n > 0:
                  n, u = divmod(n, 10)
                  if u == 0:
                      nb_zeros += 1
              return nb_zeros
      
      # TESTING
      for n in 0, 8, 100, 10010:
          print('{:6d} --> {}'.format(n, zeros(n)))
      
      # OUTPUT
      #      0 --> 1
      #      8 --> 0
      #    100 --> 2
      #  10010 --> 3
      

      解释:我们反复提取和删除个位。例如,如果:

      n == 1037
      

      然后:

      n, u = divmod(n, 10)
      

      结果:

      n == 103, u == 7
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多