【问题标题】:Resetting a counter after recursion递归后重置计数器
【发布时间】:2014-02-23 08:21:13
【问题描述】:

我正在研究一个递归函数,该函数旨在返回(而不是打印)字符串中字母字符的数量。我知道通过迭代很容易做到这一点,但我的目标是递归地做到这一点。我编写的函数在第一次调用时正确执行,但我找不到在下一次执行之前重置计数器的方法。这是我所拥有的:

counter = 0
def recAlphaCount(s):
    global counter

    if len(s) == 0:
        return 0 
    else:
        if s[0].isalpha():
            counter += 1

        recAlphaCount(s[1:])
        return counter

我尝试将 counter 的值分配给另一个变量并重置计数器,但我无法提取它的值并仍然将其重置。

有没有办法在不使用全局计数器的情况下递归地编写这个?或者有没有办法返回计数器并在函数内重置它?

谢谢

【问题讨论】:

    标签: python recursion global-variables counter


    【解决方案1】:

    你可以在参数本身中维护计数,像这样

    def recAlphaCount(s, counter = 0):
        if len(s):
            counter = recAlphaCount(s[1:], counter + int(s[0].isalpha()))
        return counter
    

    这也可以这样解决,无需显式维护计数。

    def recAlphaCount(s):
        if len(s) == 0:
            return 0
        elif s[0].isalpha():
            return 1 + recAlphaCount(s[1:])
        else:
            return recAlphaCount(s[1:])
    

    这可以缩短为

    def recAlphaCount(s):
        if len(s) == 0:
            return 0
        return int(s[0].isalpha()) + recAlphaCount(s[1:])
    

    【讨论】:

    • 我没有意识到 int(bool) 返回 0 或 1,这是一个绝妙的解决方案。谢谢
    【解决方案2】:

    global 变量很少是正确的答案!您可以将 counter 设为默认为零的参数并稍微重构:

    def recAlphaCount(s, counter=0):
        if len(s) == 0:
            return counter
        else:
            if s[0].isalpha():
                counter += 1
            return recAlphaCount(s[1:], counter)
    

    【讨论】:

    • 这是个好主意,但我的问题集严格预先定义了要使用的参数。不过谢谢,这很有见地。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多