Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在递归函数中保持计数?[Jython]_Python_Recursion_Jython - Fatal编程技术网

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

Python 在递归函数中保持计数?[Jython],python,recursion,jython,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 co

我试图使用递归函数计算字母“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) 
def xCounter(字符串):
**计数器=0**(这会在每次迭代时将计数器重置为0)
如果len(字符串)==0: 返回计数器 elif字符串[0]=“x”: 计数器=计数器+1 elif字符串[0]!='x': 返回xCounter(字符串[1:],计数器) 返回xCounter(字符串[1:],计数器)
X计数器(“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>
def xCounter(字符串,计数器):
如果len(字符串)==0:
返回计数器
elif字符串[0]=='x':
计数器=计数器+1
elif字符串[0]!='x':
返回xCounter(字符串[1:],计数器)
返回xCounter(字符串[1:],计数器)
xCounter(“werixiuewrxiewx”,0)

三,


有谁能告诉我如何在不覆盖计数或将计数定义为参数的情况下保持此函数中的计数

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

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

return xCounter[1:] +
    (if isX then 0 else 1)
最终结果将是一个加法表达式链,其中返回最终结果(1和0的加法“链”)

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

def xCounter(str):
    return xCounterHelper(str, 0)
其中
xCounterHelper
是您的原始函数


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

我想您这样做是为了练习递归,而不是为了实际的解决方案,对吗?在python中执行此操作的正确方法是

count = "gfljkgfxlkjsfxxljsx".count('x')
print count
但是,您的代码在每次迭代时都会重置计数器,这是正确的

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

尝试以下方法:

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

你真的使用Python吗<代码>条件?iftrue:iffalse语法无效。您要查找的是
如果条件正确,如果条件不正确
。第二个示例不起作用,因为
xCounter
没有第二个参数。Python中也没有私有函数。对不起,我已经两年没有使用Python了。你不能在Python中重载函数吗?如果你阅读我的第二个例子,你会发现它指的是一个重载,而不是同一个函数。即使它没有重载(我的错),它仍然是一种有效的技术。然后,包装器函数应该只使用漂亮的名称,而工作函数上有一个标记的标识符。私人评论是一般性评论;不是关于Python的。@Navith我已经解决了您的问题。我认为您的建议与Hrvoje的类似。这听起来是最符合逻辑的解决方案,谢谢你们两位帮我看。@NicWatkins他的例子比我的干净多了。我接受他的建议。如果你开始学习更复杂的递归,请记住我的第二个例子。是的,这是我正在学习的计算机科学基础课程。我将使用count函数进行尝试,并感谢您对额外参数的保证。这是一个好主意。我从未考虑过返回我想要求和的数字,然后将所有返回的值相加。非常感谢。