如何在整数中有偶数个 0 时将 python 函数编写为 return True,否则使用递归编写 return False?

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?

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

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))

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")

你有一个数字,不要转换为字符串,而是使用 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

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

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

哪个应该有效。

我们可以注意到

  • [递归基数]单个零无效,其他个位数有效
  • [递归步骤] 当我们看到 non-zero 数字时,什么都不应该改变(检查剩余部分应该给出相同的结果)。当我们看到零时,我们应该反转结果(如果之前是奇数,现在是偶数,反之亦然)。
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))

如果您使用 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(单位数字)和n//10(没有单位数字的数字)。例如,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)