您似乎正在使用递归编程,但您不了解它应该如何工作。
您正在递归调用您的函数,但递归计数需要您将问题划分为子问题;解决一个并将其余的委托给递归调用,或者将集合拆分为子问题,直到您知道如何解决一个小集合。但是,您正在尝试解决列表中所有元素的子问题,然后将整个列表传递给递归调用。这只会导致无限递归异常,因为您只查看相同的问题集。
递归版本将是:
def fizz_count(x):
if not x:
return 0
return (1 if x[0] == 'fizz' else 0) + fizz_count(x[1:])
这只是查看第一个元素并将列表其余部分的计数委托给递归调用。如果列表为空,则返回 0。
将列表分成两半是另一种选择,仅在列表为空或只有一个元素时返回:
def fizz_count(x):
lenx = len(x)
if not lenx:
return 0
if lenx == 1:
return (1 if x[0] == 'fizz' else 0)
return fizz_count(x[:lenx//2]) + fizz_count(x[lenx//2:])
如果您想循环遍历列表并以这种方式计数(不使用递归),请递增count并仅在完成循环时返回:
def fizz_count(x):
count = 0
for a in x:
if a == 'fizz':
count += 1
return count
但是,最简单的解决方案是使用标准list.count()函数:
def fizz_count(x):
return x.count('fizz')
并完成它。