Есть две основные проблемы с текущей реализацией:
c
- это int
, а int
являются неизменяемыми. Если вы измените c
, это значит, что не означает, что c
в рекурсивных вызовах "обновляется", каждый рекурсивный вызов c
будет иметь значение 0
; и
- вы не возвращаете значение в случае, если первый элемент четный, поэтому Python вернет
None
в этом случае.
def count_even(lst, c = 0):
if lst == []:
return c
if lst[0] % 2 == 0:
c += 1
# no else
return count_even(lst[1:]<b>, c+1</b>) # 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) ).