【问题标题】:How to write a python function to return True when there's even number of 0 in a integer and return False otherwise using recursion?如何编写一个python函数以在整数中有偶数个0时返回True,否则使用递归返回False?
【发布时间】:2022-02-07 18:31:25
【问题描述】:

我被要求编写一个函数,如果正整数中有偶数个 0 位,则返回 True,否则返回 False(使用递归)。作为尝试,我编写了一个函数来计算整数中 0 的个数。我可以知道如何修改程序以使其返回 True 和 False 吗?

def valid(n):
    number = str(n)
    position = number.find("0")

    if "0" not in number:
        return 0

    return 1 + valid(number[(position+1):])


print(valid(12340006))

【问题讨论】:

    标签: python recursion boolean


    【解决方案1】:

    我们可以注意到

    • [递归基数]单个零无效,其他单个数字有效
    • [递归步骤] 当我们看到非零数字时,什么都不会改变(检查剩余部分应该给出相同的结果)。当我们看到零时,我们应该反转结果(如果之前是奇数,现在是偶数,反之亦然)。
    def is_valid(num):
        n, r = divmod(num, 10)
        if n == 0:
            return r != 0
        return (not is_valid(n) if r == 0 else is_valid(n))
    

    【讨论】:

    • 哦,这很好。也许是那种让你的同事诅咒你的名字的代码;)请问 - 看起来你有一个设计递归解决方案的过程。你能说出它是什么/你在哪里学的吗?
    • @JackDeeth 我更喜欢考虑递归而不是真正的技术。对我来说,创建如下递归解决方案是最方便的:“我们有一些不需要额外处理的基本格式/输入 - 它是基数,如果它不为零,单个数字有效,并且不能小于一个数字中的 1 位。然后如果输入不同 - 我们应该处理它并调用带有修改参数的函数 - 这就是步骤。让我们取最低有效数字 d 并处理剩余的,我们应该如何解释嵌套调用的结果? ...
    • 如果d==0,则反转它(因为...),否则返回不变。这个过程会收敛吗?是的:在每一步中,我们将数字计数减一,它会在某个点达到 1。”命名受到数学归纳方案的启发:base 是简单的情况,其中陈述 A 成立,step 假设陈述 A 在某一点成立并证明语句 A 也适用于下一点。递归在其他方向上起作用,但对我来说有最直观的术语。
    【解决方案2】:
    def valid(n):
        number = str(n)
        position = number.find("0")
        if "0" not in number:
            return 0
        return 1 + valid(number[(position+1):])
    print("True" if valid(12340006)%2 ==0 else "False")
    

    【讨论】:

    • 我想这行得通。但是,我被要求编写一个函数,如果正整数中有偶数个 0 位,则返回 True,否则返回 False(使用递归)。因此,该函数不能返回整数。我遇到的困难是让函数返回布尔值。无论如何,非常感谢您的帮助!!!
    • 您可以将此函数重命名为_valid,并编写一个包装函数:def valid(n): return bool(_valid(n))
    【解决方案3】:

    我相信问题是从if "0" not in number 条件返回的0。你可以这样试试:

    def valid(n):
        
        zeros = str(n).count("0")
        
        if zeros == 0:
            return False
        else:
            return zeros % 2 == 0
    

    哪个应该有效。

    【讨论】:

      【解决方案4】:

      您有一个数字,不要转换为字符串,而是使用divmod 并除以 10:

      def valid(num, count=0):
          num, r = divmod(num, 10) # extract the last digit (r)
          if num == 0:             # we exhausted the number
              return count%2==0    # is there an even number of zeros?
          else:
              return valid(num, count=count+int(r==0))
      
      处理 0 -> 错误:
      def valid(num, count=None):
          if count is None:
              count = int(num==0)
          num, r = divmod(num, 10)
          if num == 0:
              return count%2==0
          else:
              return valid(num, count=count+int(r==0))
      

      例子:

      >>> valid(12340006)
      False
      
      >>> valid(10203)
      True
      
      >>> valid(0)
      False
      

      【讨论】:

      • 感谢您的帮助!!但是在问题中,声明该函数应该只接受一个参数。我可以知道我该怎么做吗?
      • 输入0会失败:无效,返回True。
      • @SUTerliakov 这是一个模棱两可的数字(0 是唯一允许前导零的数字),但很容易修复(见更新)
      • 哎呀,@mozway,很抱歉快速发表评论。它对 0 失败,但对正数明确说明了问题,而不是非负数。
      • @SUTerliakov 是的,我很忙,这很愚蠢;)明确的初始检查更好
      【解决方案5】:

      如果您使用str 将数字转换为字符串,那么您不必使用递归实现自己的循环。您可以使用str.count 计算字符串中'0' 的数量,然后使用% 测试该数字是奇数还是偶数。

      def is_valid(n):
          s = str(n)
          nb_of_zeroes = s.count('0')
          return (nb_of_zeroes % 2 == 0)
      

      如果你想自己实现逻辑,而不是使用strcount,那么你可以循环使用divmod(n, 10)n的数字上提取n%10(单位数字)和@ 987654331@(没有个位的数字)。例如,divmod(9836, 10)(983, 6)

      def is_valid(n):
          if n == 0:
              return False  # special case for 0 which is a bit different from other numbers
          else:
              nb_of_zeroes = 0
              while n >= 10:
                  n,u = divmod(n, 10)
                  if u == 0:
                      nb_of_zeroes += 1
              return (nb_of_zeroes % 2 == 0)
          
      

      【讨论】:

        猜你喜欢
        • 2019-11-23
        • 2012-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-19
        • 1970-01-01
        • 2017-02-25
        • 1970-01-01
        相关资源
        最近更新 更多