递归函数 - 计算元组中偶数的数量

问题描述 投票:1回答:2

我必须计算一个元组中的对数。我无法使用while或for。它必须是递归函数。我必须具备的结果是,例如:

count_pairs((4, 5, 6))   
2
count_pairs(())
()
count_pairs((3, 5, 7))
0

这是我到目前为止:

def count_pairs(t):
    if len(t) == 0:
        return ()
    elif t[0] % 2 == 0:
        return 1 + count_pairs(t[1:])
    else:
        return count_pairs(t[1:])

我的难点是如果给我一个空元组,我怎么能返回()。因为我拥有的每一个结果都是()。有些东西不对。你能帮我么?我是Python的初学者。谢谢

python tuples
2个回答
2
投票

写这个的一个简单方法是将当前元素的结果(t的第一个元素)存储在变量(this)中,并将计数对(偶数元素)的结果存储在另一个变量(rest)中。然后,如果rest有一个“truthy值”(它不是一个空元组),那么你可以将01返回给它;否则你只需返回这个数字,不要连接这两个数字。

也就是说,

def count_pairs(t):
    if len(t) == 0:
        return ()
    rest = count_pairs(t[1:])
    this = t[0] % 2 == 0
    return this + rest if rest else this

工作良好:

>>> count_pairs((4, 5, 6))
2
>>> count_pairs(())
()
>>> count_pairs((3, 5, 7))
0

然而,正如你在评论中所遗漏的那样,事实上确实有必要为空元组返回0,而不是另一个空元组。这是因为函数通常应该返回相同的数据类型(在Python中不强制它使代码更灵活,但它绝对是其他语言的要求)。

如果你这样做,代码也会变得更整洁:

def count_pairs(t):
    if len(t) == 0:
        return 0
    return (t[0] % 2 == 0) + count_pairs(t[1:])

现在表现出来,我认为是一种更自然的方式:

>>> count_pairs((4, 5, 6))
2
>>> count_pairs(())
0
>>> count_pairs((3, 5, 7))
0

脚注

我只想指出,t[0] % 2 == 0语句相当于1 if t[0] % 2 == 0 else 0,因为1相当于True0False,在Python中。这使代码更清晰。


0
投票

在python2中

def count_pairs(tup):
    if len(tup) == 0:
        return ()
    elif len(tup) == 1:
        return (tup[0] + 1) % 2
    else:
        return ((tup[0] + 1) % 2) + count_pairs(tup[1:])
© www.soinside.com 2019 - 2024. All rights reserved.