我必须计算元组中的对数。我不能同时使用或为。它必须是递归函数。例如,我必须得到的结果是:
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
有一个"真值"(它不是一个空元组),那么你可以把这个元素的0
或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
,因为1
等价于True
和0
False
在 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:])