在递归函数中保持计数? [Jython的]

时间:2015-07-06 23:08:12

标签: python recursion jython

我试图计算字母' 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(&#34; gfljkgfxlkjsfxxljsx&#34)

     
    

0

  

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

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(&#34; werixiuewrxiewx&#34;,0)

     
    

3

  

任何人都可以向我提供一些有关如何在不覆盖计数或将计数定义为参数的情况下保持计数的一些见解吗?

3 个答案:

答案 0 :(得分:1)

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

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

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

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

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

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

其中xCounterHelper是您的原始功能。

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

答案 1 :(得分:1)

我认为你这样做是为了进行递归运动,而不是实际的解决方案,对吧?在python中执行此操作的正确方法是

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

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

有一些方法(比如全局变量)可以跟踪计数器而不用它作为参数,但是这样很糟糕。额外的参数是正确的方法。

答案 2 :(得分:1)

试试这个:

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

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

当然,这不是它的完成方式,但它在递归函数中是一种很好的做法。

你甚至可以缩短它,比如lambda:

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