我真的很难得到递归,但我尝试递归来匹配字符串中的模式.
假设我有一个极客的字符串极客,我有一个模式eks匹配.我可以使用很多方法,如正则表达式,查找字符串类的方法,但我真的想通过递归来做这件事.
为实现这一点,我试过这段代码:
void recursion(int i,string str)
{
if(!str.compare("eks"))
cout<<"pattern at :"<<i<<'\n';
if(i<str.length() && str.length()-1!=0)
recursion(i,str.substr(i,str.length()-1));
}
int main()
{
string str("geeks for geeks");
for(int i=0;i<str.length();i++)
recursion(i,str.substr(i,str.length()));
}
Run Code Online (Sandbox Code Playgroud)
输出:
期望的输出:
pattern at 2
pattern at 12
Run Code Online (Sandbox Code Playgroud)
我在这里做错了什么,以及通过递归来做这件事的好方法是什么?
我理解cpp中的很多主题,但是通过递归,我知道它们是如何工作的,甚至每当我尝试使用递归编写代码时,它都无法工作.是否有任何地方可以帮助我进行递归?
你永远不会得到pattern at 2
,因为compare
这样不起作用.问问自己,会发生什么
std::string("eks for geeks").compare("eks")
Run Code Online (Sandbox Code Playgroud)
返回?那么,根据文档,你会得到积极的东西,因为"eks for geeks"
它比...更长"eks"
.所以你的第一步是解决这个问题:
void recursion(int i, std::string str){
if(!str.substr(0,3).compare("eks")) {
std::cout << "pattern at: " << i << '\n';
}
Run Code Online (Sandbox Code Playgroud)
接下来,我们必须递归.但是还有一些东西.i
应该是你的"光标"的当前位置.因此,你应该推进它:
i = i + 1;
Run Code Online (Sandbox Code Playgroud)
如果我们在每次迭代中减少字符串的长度,我们就不能测试i < str.length
,否则我们不会检查字符串的后半部分:
if(str.length() - 1 > 0) {
recursion(i, str.substr(1));
}
}
Run Code Online (Sandbox Code Playgroud)
在我们实际编译此代码之前,让我们理解它:
"eks"
i
除了当前的位置,我们从不使用似乎合理:
#include <iostream>
#include <string>
void recursion(int i, std::string str){
if(!str.substr(0,3).compare("eks")) {
std::cout << "pattern at: " << i << '\n';
}
i = i + 1;
if(str.length() - 1 > 0) {
recursion(i, str.substr(1));
}
}
int main () {
recursion(0, "geeks for geeks");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
pattern at: 2
pattern at: 12
Run Code Online (Sandbox Code Playgroud)
但是,这不是最佳的.有几种可能的优化.但这只是一个练习.
compare
substr
由于它的算法需要使用.编写自己不需要的比较函数substr
.for
循环是错误的.为什么?