在递归函数中保持计数?[杰森]

2024-09-23 22:23:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用递归函数计算字母“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

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

^{pr2}$

xCounter("werixiuewrxiewx",0)

3

有谁能给我一些关于如何在这个函数中保持count而不重写count或将count定义为参数的一些见解吗?在


Tags: 函数字符串br参数stringreturn定义count
3条回答

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

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

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

有一些方法(比如全局变量)来跟踪计数器而不将其用作参数,但这是坏的坏的坏的。额外的参数是正确的方法。在

返回递归调用,如果字符存在,则加1。本例中的计数器为0或1,而不是运行总数。在

您可以将布尔变量设置为当前字符是否为“x”,然后可以将最后一行更改为类似以下内容:

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

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

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

^{pr2}$

其中xCounterHelper是原始函数。在

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

试试这个:

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

。。。如果到达字符串的末尾,则返回0,否则返回0或1(取决于字符串[0]是“x”)加上字符串其余部分的函数值。。。你把所有这些数字加起来,然后得到你的答案!在

当然,这不是怎么做到的,但在递归函数中这是一个很好的实践。在

你甚至可以做得更短,比如一个兰姆达:

^{pr2}$

相关问题 更多 >