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



我必须计算元组中的对数。我不能同时使用或为。它必须是递归函数。例如,我必须得到的结果是:

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的初学者。谢谢

一个简单的方法是将当前元素(t的第一个元素)的结果存储在一个变量(this)中,将计数对(偶数元素)的结果存储在另一个变量(rest)中。然后,如果rest有一个"真值"(它不是一个空元组),那么你可以把这个元素的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 中。这使代码更简洁。

in 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:])

最新更新