首页 > 解决方案 > 递归函数 - 计算元组中偶数的个数

问题描述

我必须计算一个元组中的对数。我不能使用 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 的初学者。谢谢

标签: pythontuples

解决方案


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

也就是说,

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, 因为在 Python1中等价于Trueand 0to 。False这使代码更干净。


推荐阅读