Python使用递归计算字符串中的字符数

时间:2013-09-26 18:37:42

标签: python string recursion

我一直坐在这里3个小时试图确定如何解决这个问题。我必须创建一个名为countLetterString(char,str)和countLetterFile(char,TextFILE)的原始函数 我需要使用递归来查找给定字符在字符串中出现的次数,并使用for循环来查找它在文本文件中出现的次数。我真的很难过如何开始。

def countLetterString(char, str):
    if str == 0:
       return 0
    else:
    .... countLetterString(...)

我不明白它是如何工作的:/

编辑:到目前为止,我感谢所有的帮助:)它真的帮助我理解这个概念。 到目前为止,我的代码看起来像这样。

def countLetterString(char,str):

if not str:
    return 0
else:
    return 1 + countLetterString(char, str[1:])

所有这一切都是计算字符串中有多少个字符,但我似乎无法弄清楚如何拆分字符串然后查看字符是否是字符拆分

7 个答案:

答案 0 :(得分:2)

首先,您不应将str用作变量名,因为它会掩盖内置的str类型。请改用stext之类的内容。

if str == 0:行不会达到预期效果,检查字符串是否为空的正确方法是if not str:if len(str) == 0:(首选方法是首选)。有关详细信息,请参阅this answer

所以现在你已经找到了递归的基本情况,那么“步骤”是什么。您要么返回1 + countLetterString(...)0 + countLetterString(...),只需少一个字符即可调用countLetterString()。如果您删除的字符与1匹配,则会使用char,否则为0。例如,您可以使用s检查char中的第一个字符是否与s[0] == char匹配。

要删除字符串中的单个字符,您可以使用切片,因此对于字符串s,您可以获取所有字符,但第一个字符使用s[1:],或者所有字符,但最后一个使用{{1} }}。希望这足以让你入门!

答案 1 :(得分:2)

第一步是将这个问题分解成碎片:

<强> 1。如何确定字符是否在字符串中?

如果您以递归方式执行此操作,则需要检查字符串的第一个字符。

<强> 2。如何比较两个字符?

Python有一个==运算符,用于确定两个事物是否等效

第3。在我知道字符串的第一个字符是否匹配后我该怎么办?

你需要继续前进到字符串的其余部分,但不知何故还要保留到目前为止看到的字符数。使用for循环通常很容易,因为你可以在它之外声明一个变量,但是递归地你必须将程序的 state 传递给每个新的函数调用。

这是一个递归计算字符串长度的例子:

def length(s): 
   if not s:  # test if there are no more characters in the string
      return 0
   else:  # maintain a count by adding 1 each time you return
          # get all but the first character using a slice
      return 1 + length( s[1:] )

从此示例中,看看您是否可以完成您的问题。你的将有一个额外的步骤。

<强> 4。我什么时候停止递归?

在处理递归时,这总是一个问题,我何时需要停止回忆自己。看看你是否可以解决这个问题。

修改

not s将测试s是否为空,因为在Python中,空字符串""的计算结果为False;和not False == True

答案 2 :(得分:1)

关于递归的推理需要将问题分解为&#34;常规&#34;和#34;特别&#34;案例。这里有什么特例?好吧,如果字符串为空,那么char肯定不在字符串中。在这种情况下返回0。

还有其他特殊情况吗?并不是的!如果字符串不为空,则可以将其分解为第一个字符(the_string[0])和其余所有字符(the_string[1:])。然后,您可以递归计算其余字符出现次数,如果第一个字符等于您要查找的char,则加1。

我认为这是一项任务,所以我不会为你编写代码。这并不难。请注意,您的if str == 0:无法正常工作:测试str是否为整数0if len(str) == 0:是一种可行的方式,if str == "":是另一种方式。有更短的方法,但在这一点上,这些可能是最清楚的。

答案 3 :(得分:0)

首先,我建议你不要使用char或str。 Str是一个内置的函数/类型,虽然我不相信char会给你任何问题,但它是许多其他语言中的保留字。其次,您可以使用count实现相同的功能,如:

letterstring="This is a string!"
letterstring.count("i")

它将为您提供给定字符串中i的出现次数,在本例中为3.

如果你需要纯粹为了推测而做,那么用递归记住的事情是携带一些条件或计数器,每次调用并在代码中放置一些条件会改变它。例如:

def  countToZero(count):
   print(str(count))
   if count > 0:
      countToZero(count-1)

请记住这是一个非常快速的示例,但正如您在每次调用中看到的那样,我打印当前值,然后函数在递减计数时再次调用自身。一旦计数不再大于0,该函数将结束。

了解这一点,您将需要跟踪您的数量,您在字符串中比较的索引,您要搜索的字符以及给出示例的字符串本身。没有为你做代码,我认为至少应该给你一个开始。

答案 4 :(得分:0)

您必须先确定一个基本案例。递归展开并返回的点。

在这种情况下,基本情况将是字符串中没有(更多)特定字符实例(例如X)的点。 (if string.find(X) == -1: return count)并且该函数不再调用自身,并返回其找到的实例数,同时信任其先前的调用者信息。

递归意味着一个函数从内部调用自身,因此创建一个堆栈(至少在Python中)的调用,每个调用都是一个个体,具有指定的目的,不知道在调用之前发生了什么,除非提供,它添加了自己的结果和返回(严格来说)。此信息必须由其调用者,其父级提供,或者可以使用不可取的全局变量来完成。

因此,在这种情况下,信息是字符串的第一部分中的父函数找到了该特定字符的实例数。由我们提供的初始函数调用也需要提供该信息,因为我们是所有函数调用的根,并且不知道(因为我们没有处理字符串)有多少X是在那里,我们可以安全地告诉最初的调用,因为我没有通过字符串并且没有找到任何或零/ 0 X因此这里是字符串整个字符串,你能不能踩< em> rest 和find其中有多少X。此0作为便利可能是该函数的默认参数,或每次 进行调用时都必须提供0

该函数何时调用另一个函数?

递归将任务分解为最精细的级别(严格来说,可能)并将其余部分留给(大)子(ren)。对此任务进行最精细的细分将是find X的单个实例,并将中的其余字符串传递给独占(点+ 1 }}它在下一次调用时发生,并将1添加到其父函数为其提供的count

if not string.find(X) == -1:
    string = string[string.find(X) + 1:]
    return countLetterString(char, string, count = count + 1)`

通过迭代/循环计算文件中的X

它会涉及open文件(TextFILE),然后是text = read(TextFile)textstr。然后循环遍历每个字符(for char in text:),记住粒度,每次char(等于)== Xcount增加+=1。在您运行循环之前指定从未通过string,因此count代表X(在{ {1}})text。 (听起来很熟悉?)

= 0

答案 5 :(得分:0)

#This function will print the count using recursion.
def countrec(s, c, cnt = 0):
    if len(s) == 0:
        print(cnt)
        return 0
    if s[-1] == c:
        countrec(s[0:-1], c, cnt+1)
    else:
        countrec(s[0:-1], c, cnt)

#Function call
countrec('foobar', 'o')

答案 6 :(得分:0)

使用额外的参数,可以实现相同的功能。 工作功能代码:

def countLetterString(char, str, count = 0):
    if len(str) == 0:
        return count
    if str[-1] == char:
        return countLetterString(char, str[0:-1], count+1)
    else:
        return countLetterString(char, str[0:-1], count)