【问题标题】:Keeping count in a recursive function? [Jython]在递归函数中保持计数? [Jython]
【发布时间】:2015-07-06 23:08:12
【问题描述】:

我正在尝试使用递归函数计算字母“x”出现在字符串中的次数。我的函数目前执行此操作,但是我希望只有一个参数(字符串)。当函数在返回行中迭代时,我很难创建一个未被覆盖的计数器。

为了说明我的意思:

def xCounter(string): <br>
 **counter = 0** (This resets the counter to 0 with each iteration)  <br>
    if len(string) == 0: 
       return counter 
    elif string[0] == 'x': 
       counter = counter + 1  
    elif string[0] != 'x': 
       return xCounter(string[1:],counter) 
   return xCounter(string[1:],counter) 

xCounter("gfljkgfxlkjsfxxljsx")

0

到目前为止,我让它工作的唯一方法是将计数器定义为参数:

def xCounter(string, counter):  <br>
   if len(string) == 0: <br>
      return counter <br>
   elif string[0] == 'x': <br>
      counter = counter + 1  <br>
   elif string[0] != 'x': <br>
      return xCounter(string[1:],counter) <br>
   return xCounter(string[1:],counter) <br>

xCounter("werixiuewrxiewx",0)

3

谁能给我一些关于如何在这个函数中保持计数而不覆盖计数或将计数定义为参数的见解?

【问题讨论】:

    标签: python recursion jython


    【解决方案1】:

    我假设您这样做是为了进行递归练习,而不是实际解决方案,对吧?在 python 中正确的方法是

    count = "gfljkgfxlkjsfxxljsx".count('x')
    print count
    

    但是,您是正确的,因为您的代码在每次迭代时都会重置计数器,这是应该的。

    有一些方法(如全局变量)可以在不将计数器用作参数的情况下跟踪计数器,但那是 BAD BAD BAD。额外的参数是正确的方法。

    【讨论】:

    • 是的,这是针对我正在学习的基础计算计算机科学课程的。我会尝试使用 count 函数,并感谢您对额外参数的保证。
    【解决方案2】:

    试试这个:

    def xCounter(string): 
        if len(string) == 0: return 0     
        return (string[0]=='x') + xCounter(string[1:])
    

    ...如果到达字符串的末尾,则返回 0,否则返回 0 或 1(取决于 string[0] 是否为 'x')加上字符串其余部分的函数值...你最终将所有这些数字相加并得到答案!

    当然,这不是它的完成方式,但它是递归函数的一个好习惯。

    你甚至可以做得更短,比如 lambda:

    f=lambda s:len(s) and (s[0]=='x') + f(s[1:]) or 0
    

    【讨论】:

    • 这是个好主意。我从来没有考虑过返回我想要求和的数字,然后将所有返回的值加在一起。谢谢!
    【解决方案3】:

    返回递归调用,如果字符存在则加 1。在这种情况下,计数器将是 0 或 1;而不是运行总数。

    你可以设置一个布尔变量来判断当前字符是否是一个'x',然后你可以把最后一行改成类似:

    return xCounter[1:] +
        (if isX then 0 else 1)
    

    最终结果将是一个加法表达式链,其中返回最终结果(1 和 0 的加法“链”)。

    您还可以将“workhorse”函数包装在自动传入初始参数的包装器中,这样调用者就不必:

    def xCounter(str):
        return xCounterHelper(str, 0)
    

    xCounterHelper 是您的原始函数。

    在需要更多参数的复杂递归函数中,第二个选项非常方便。将丑陋的多参数版本隐藏为私有函数(如果它是类方法),并公开更清晰的 1 参数版本(注意 Python 没有私有函数。这对于有私有函数的语言来说更是如此)。

    【讨论】:

    • 你真的使用 Python 吗? cond ? iftrue : iffalse 不是有效的语法。您正在寻找iftrue if cond else iffalse。第二个示例不起作用,因为xCounter 没有第二个参数。 Python 中也没有私有函数。
    • 抱歉,我已经有 2 年没用过 Python 了。你不能在 Python 中重载函数吗?如果您阅读我的第二个示例,您会发现它指的是重载,而不是同一个函数。即使它没有重载(我的错),它仍然是一种有效的技术。包装函数应该只取漂亮的名字,而工作函数有一个标记在上面的标识符。私人评论是一般评论;与 Python 无关。
    • @Navith 我已经解决了你的问题。
    • 我认为您的建议与 Hrvoje 的建议相似。这听起来像是最合乎逻辑的解决方案,谢谢你们帮我看看。
    • @NicWatkins 他的例子比我的要干净得多。我会接受他的。如果您开始进行更复杂的递归,请记住我的第二个示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多