3 回答
TA贡献1765条经验 获得超5个赞
当前的实现有两个基本问题:
c
是 anint
,并且int
s 是不可变的。如果更改c
,因此,这也并不意味着c
在递归调用的“更新”,每次递归调用c
将具有价值0
; 和如果第一项是偶数,则不会返回值,因此
None
在这种情况下Python 将返回。
def count_even(lst, c = 0):
if lst == []:
return c
if lst[0] % 2 == 0:
c += 1
# no else
return count_even(lst[1:], c+1) # pass a new value for c
然而,更紧凑的表示是:
def count_even(lst, c = 0):
if not lst:
return c
return count_even(lst[1:], c + 1 - lst[0] % 2)
但是请注意,线性递归通常不是一个好主意,因为调用堆栈会随着元素数量的增加而增长,因此很容易导致溢出(尤其是因为 Python 没有实现尾调用优化 (TCO))。
TA贡献2012条经验 获得超12个赞
万一lst[0] % 2 == 0,您没有返回任何内容(因此隐式返回None)。您也永远不会c在递归中包含 的更新值。将其更改为
if lst == []:
return c
if lst[0] % 2 == 0:
c += 1
return count_even(lst[1:], c)
你很好。由于其他答案包括一些漂亮的替代解决方案,我将继续提名
def count_even(lst):
return 1 - lst[0]%2 + count_even(lst[1:]) if lst else 0
以及。
TA贡献1809条经验 获得超8个赞
你几乎做到了。只是一个简单的修正。您正在调用 else 块中的递归,这是不正确的。您应该在块之外考虑它。检查以下代码:
def count_even(lst, c = 0):
"""
parameters : a lst of type list
returns : the even elements from that list
"""
if lst == []:
return c
if lst[0] % 2 == 0:
c = c + 1
return c + count_even(lst[1:])
print(count_even([1,2,3,4,5,6,7,8,9]))
添加回答
举报