1

我必须在需要使用递归的地方创建一个函数countLetterString(char, str)来查找给定字符在字符串中出现的次数。

到目前为止,我的代码看起来像这样。

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

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

4

7 回答 7

3

第一步是将这个问题分解为多个部分:

1.如何判断一个字符是否在字符串中?

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

2. 如何比较两个字符?

Python 有一个==运算符来判断两件事是否等价

3. 知道字符串的第一个字符是否匹配后怎么办?

您需要继续处理字符串的其余部分,但要以某种方式保持您迄今为止看到的字符的计数。这通常使用 for 循环非常容易,因为您可以在其外部声明一个变量,但您必须递归地将程序的状态传递给每个新的函数调用。

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

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

于 2013-09-26T18:46:41.563 回答
2

首先,您不应该将str其用作变量名,因为它会掩盖内置的 str 类型。使用类似sor的东西text

if str == 0:行不会像您期望的那样,检查字符串是否为空的正确方法是使用if not str:or if len(str) == 0:(首选第一种方法)。有关更多信息,请参阅此答案

所以现在你已经弄清楚了递归的基本情况,那么“步骤”是什么。您要么想返回,1 + countLetterString(...)要么要少一个字符。您将使用if 您删除的字符匹配,否则。例如,您可以使用. 来检查第一个字符是否匹配。0 + countLetterString(...)countLetterString()1char0schars[0] == char

要删除字符串中的单个字符,您可以使用切片,因此对于字符串s,您可以获得除第一个 using 之外的s[1:]所有字符,或除最后一个 using 之外的所有字符s[:-1]。希望这足以让你开始!

于 2013-09-26T18:44:21.863 回答
1

关于递归的推理需要将问题分解为“常规”和“特殊”情况。这里有哪些特殊情况?好吧,如果字符串是空的,那么char肯定不在字符串中。在这种情况下返回 0。

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

我假设这是一个作业,所以我不会为你编写代码。这并不难。请注意,您if str == 0:将不起作用:这是测试是否str为 integer 0if len(str) == 0:是一种可行的方式,if str == "":也是另一种方式。有更短的方法,但在这一点上,这些可能是最清楚的。

于 2013-09-26T18:47:22.313 回答
0

First of all you I would suggest not using char or str. Str is a built function/type and while I don't believe char would give you any problems, it's a reserved word in many other languages. Second you can achieve the same functionality using count, as in :

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

which would give you the number of occurrences of i in the given string, in this case 3.

If you need to do it purely for speculation, the thing to remember with recursion is carrying some condition or counter over which each call and placing some kind of conditional within the code that will change it. For example:

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

Keep it mind this is a very quick example, but as you can see on each call I print the current value and then the function calls itself again while decrementing the count. Once the count is no longer greater than 0 the function will end.

Knowing this you will want to keep track of you count, the index you are comparing in the string, the character you are searching for, and the string itself given your example. Without doing the code for you, I think that should at least give you a start.

于 2013-09-26T19:42:19.523 回答
0

你必须先决定一个基本情况。递归展开和返回的点。

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

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

因此,在这种情况下,信息是父函数在字符串的第一部分中找到了多少个该特定字符的实例。我们进行的初始函数调用也需要提供该信息,因为我们是所有函数调用的根源,并且不知道(因为我们没有踩过字符串)X我们可以安全地知道有多少 s最初的电话是,因为我没有通过字符串并且没有找到任何或零/0 X因此这是整个字符串的字符串,请您踩一下其余的字符串并find找出其中有多少X。为方便起见,这0可能是函数的默认参数,或者0每次都必须提供拨打电话。

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

递归正在将任务分解为最细粒度的级别(严格来说,也许是),并将其余的留给(孙)子(人)。这个任务的最细粒度的分解将是find单个实例X并将字符串的其余部分从它发生的、排他(点)传递到下一次调用,并将其添加到其父函数为其提供的.+ 11count

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

X通过迭代/循环在文件中计数。

它将涉及opening file( TextFILE),然后text = read(TextFile)ing 它,text是一个string。然后循环遍历每个字符 ( for char in text:) ,记住粒度,每次char(等于) ,== X递增count. +=1在运行循环之前,请指定从未经历过string,因此您的countfor 数字X(in text) 是= 0。(听起来很熟悉?)

return count.

于 2013-09-26T20:05:43.340 回答
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')
于 2021-04-04T08:36:24.030 回答
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)
于 2021-04-04T09:41:18.470 回答