我一直坐在这里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:])
所有这一切都是计算字符串中有多少个字符,但我似乎无法弄清楚如何拆分字符串然后查看字符是否是字符拆分
答案 0 :(得分:2)
首先,您不应将str
用作变量名,因为它会掩盖内置的str类型。请改用s
或text
之类的内容。
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
是否为整数0
。 if 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)
,text
是str
。然后循环遍历每个字符(for char in text:
),记住粒度,每次char
(等于)== X
,count
增加+=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)