我必须计算一个元组中的对数。我无法使用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的初学者。谢谢
写这个的一个简单方法是将当前元素的结果(t
的第一个元素)存储在变量(this
)中,并将计数对(偶数元素)的结果存储在另一个变量(rest
)中。然后,如果rest
有一个“truthy值”(它不是一个空元组),那么你可以将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中。这使代码更清晰。
在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:])