python 计算列表中的奇数
这是我家庭作业的一部分,我已经接近最终答案,但还没有完全实现。我需要编写一个计算列表中奇数的函数。
创建一个递归函数 count_odd(l) ,它将整数列表作为其唯一参数。该函数将返回奇数列表元素的数量,即不能被 2 整除的列表元素的数量。\
>>> print count_odd([])
0
>>> print count_odd([1, 3, 5])
3
>>> print count_odd([2, 4, 6])
0
>>> print count_odd([0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144])
8
这是我到目前为止所拥有的: #- 递归函数 count_odd -#
def count_odd(l):
"""returns a count of the odd integers in l.
PRE: l is a list of integers.
POST: l is unchanged."""
count_odd=0
while count_odd<len(l):
if l[count_odd]%2==0:
count_odd=count_odd
else:
l[count_odd]%2!=0
count_odd=count_odd+1
return count_odd
#- test harness
print count_odd([])
print count_odd([1, 3, 5])
print count_odd([2, 4, 6])
print count_odd([0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144])
你能帮忙解释一下我缺少什么吗?前两个测试工具工作正常,但我无法获得最后两个。谢谢!
This is a part of my homework assignment and im close to the final answer but not quite yet. I need to write a function that counts odd numbers in a list.
Create a recursive function count_odd(l) which takes as its only argument a list of integers. The function will return a count of the number of list elements that are odd, i.e., not evenly divisible by 2.\
>>> print count_odd([])
0
>>> print count_odd([1, 3, 5])
3
>>> print count_odd([2, 4, 6])
0
>>> print count_odd([0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144])
8
Here is what i have so far:
#- recursive function count_odd -#
def count_odd(l):
"""returns a count of the odd integers in l.
PRE: l is a list of integers.
POST: l is unchanged."""
count_odd=0
while count_odd<len(l):
if l[count_odd]%2==0:
count_odd=count_odd
else:
l[count_odd]%2!=0
count_odd=count_odd+1
return count_odd
#- test harness
print count_odd([])
print count_odd([1, 3, 5])
print count_odd([2, 4, 6])
print count_odd([0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144])
Can u help explain what im missing. The first two test harness works fine but i cant get the final two. Thanks!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(10)
由于这是作业,请考虑这个仅对列表进行计数的伪代码:
这与作业要求的非常相似,但需要将其转换为 Python,并且您必须计算出正确的递归案例逻辑。
快乐编码。
Since this is homework, consider this pseudo-code that just counts a list:
This is very similar to what the homework is asking for, but it needs to be translate to Python and you must work out the correct recursive case logic.
Happy coding.
切片好吗?对我来说,感觉不到递归,但我想整个事情有点违反通常的习惯用法(即 - Python 中的这种递归):
x%2
is < code>1 为赔率,0
为偶数。如果您对此感到不舒服或只是不理解它,请使用以下内容代替上面的最后一行:PS - 这是相当递归的,如果您将其转入=P,请看看您的老师怎么说
Are slices ok? Doesn't feel recursive to me, but I guess the whole thing is kind of against usual idioms (i.e. - recursion of this sort in Python):
x%2
is1
for odds,0
for evens. If you are uncomfortable with it or just don't understand it, use the following in place of the last line above:PS - this is pretty recursive, see what your teacher says if you turn this in =P
所有先前的答案都将问题细分为大小为 1 和大小为 n-1 的子问题。有几个人指出,递归堆栈可能很容易崩溃。此解决方案应将递归堆栈大小保持在 O(log n):
All of the prior answers are subdividing the problem into subproblems of size 1 and size n-1. Several people noted that the recursive stack might easily blow out. This solution should keep the recursive stack size at O(log n):
递归的目标是将问题分成更小的部分,并将解决方案应用于更小的部分。在这种情况下,我们可以检查列表的第一个数字 (
l[0]
) 是否为奇数,然后使用列表的其余部分 (l[1:]
),将当前结果添加到递归结果中。The goal of recursion is to divide the problem into smaller pieces, and apply the solution to the smaller pieces. In this case, we can check if the first number of the list (
l[0]
) is odd, then call the function again (this is the "recursion") with the rest of the list (l[1:]
), adding our current result to the result of the recursion.尾部递归
Python 中没有尾部调用优化,因此上述版本纯粹是教育性的。
该调用可以可视化为:
简单的蹦床
为了避免大型数组的“超出最大递归深度”错误,递归函数中的所有尾部调用都可以包装在 lambda: 表达式中;并且可以使用特殊的 Trampoline() 函数来解包此类表达式。它有效地将递归转换为简单循环的迭代:
示例:
Tail recursion
There is no tail-call optimization in Python, so the above version is purely educational.
The call could be visualize as:
Simple trampolining
To avoid 'max recursion depth exceeded' errors for large arrays all tail calls in recursive functions can be wrapped in
lambda:
expressions; and specialtrampoline()
function can be used to unwrap such expressions. It effectively converts recursion into iterating over a simple loop:Example:
我会这样写:
I would write it like this:
不确定我是否收到你的问题,但与上面类似:
not sure if i got your question , but as above something similar:
生成器可以用一行代码快速给出结果:
Generator can give quick result in one line code: