-1

我最近才开始用 python 编程。这是我第一次接触编程。

这是代码学院的问题。我基本上需要:

“编写一个调用函数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

但这不起作用。我哪里错了?

4

1 回答 1

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')

并完成它。

于 2013-07-05T12:18:40.263 回答