我最近才开始在python中编程。这是我在编程方面的第一次经历。
这是来自code academy的问题。我基本上需要:
“编写一个名为
fizz_count
的函数,它将列表x作为输入,并返回该列表中字符串"fizz"
的计数。例如,
fizz_count(["fizz","buzz","fizz"])
应返回2.“
这是我的代码:
def fizz_count(x):
count = 0
for a in x:
if a == "fizz":
return fizz_count(x) == 1 + count
else:
return fizz_count(x) == count
但这不起作用。我哪里错了?
答案 0 :(得分:8)
您似乎正在使用递归编程,但您不了解它应该如何工作。
您正在递归调用函数,但递归计数需要您将问题划分为子问题;求解一个并将其余部分委托给递归调用,或者将该集合拆分成子问题,直到你知道如何解决这个问题为止。但是,您尝试解决列表中所有元素的子问题,然后将整个列表传递给递归调用。这只会导致无限递归异常,因为您只看同一个问题集。
递归版本将是:
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')
并完成它。