python - 递归函数 - 计算元组中偶数的个数
问题描述
我必须计算一个元组中的对数。我不能使用 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
有一个“真值”(它不是一个空元组),那么你可以将这个元素的0
or返回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
中等价于True
and 0
to 。False
这使代码更干净。
推荐阅读
- spring - 使用 jpa 访问 sqlite db 文件
- r - 多重控制图 EWMA RStudio
- r - ggplot在r中具有三个变量x~axis
- android - 在我膨胀当前视图(activity_main)后,onClickListener()不起作用
- flutter - Flutter Provider“在 null 上调用了 getter 'length'。”
- php - 我如何在 htdocs 之外使用 Xampp 和 Laravel
- ajax - Jquery ajax, $.each 等待完成
- java - Android底部导航:图标和文本之间的空间
- amazon-web-services - 连接成功1-2周后出现ec2公钥错误
- javascript - Acrobat 中的 Javascript - 无法将值传递出对话框