给定的字符串s
和t
进行递归计算,如果t
中包含s
,则返回true
。
示例:bool find("Names Richard", "Richard") == true
;
我已经在下面编写了代码,但是我不确定在C ++中使用递归是否正确。我今天在课堂上学习了递归。
#include <iostream>
using namespace std;
bool find(string s, string t)
{
if (s.empty() || t.empty())
return false;
int find = static_cast<int>(s.find(t));
if (find > 0)
return true;
}
int main()
{
bool b = find("Mississippi", "sip");
string s;
if (b == 1) s = "true";
else
s = "false";
cout << s;
}
如果有人在我的代码中发现错误,请告诉我,以便我可以解决它或在哪里可以学习/阅读有关此主题的更多信息。我需要准备在这个星期三进行递归测试。
最佳答案
自从我写下答案以来,这个问题已经改变。
我的评论是关于看起来像这样的代码的(可能会递归)...
#include <iostream>
using namespace std;
bool find(string s, string t)
{
if (s.empty() || t.empty())
return false;
string start = s.substr(0, 2);
if (start == t && find(s.substr(3), t));
return true;
}
int main()
{
bool b = find("Mississippi", "sip");
string s;
if (b == 1) s = "true";
else
s = "false";
cout << s;
}
当心这个:
if (start == t && find(s.substr(3), t));
return true;
这并没有按照您的想法做。
;
语句结尾的if
留下一个空的正文。无论该测试的结果如何,您的find()
函数都将返回true
。我建议您在调试之前提高编译器的警告级别,以解决此类问题。
顺便说一句,我发现在每个代码块(甚至是一行代码块)周围都使用大括号可以帮助我避免这种错误。
您的代码中也存在其他错误。从
2
中删除魔术数字3
和find()
会鼓励您思考它们代表的含义,并为您指明正确的道路。您希望
start == t && find(s.substr(3), t)
如何工作?如果您可以用简单的英语(或您的母语)表达算法,则您有更大的机会可以用C ++表达它。此外,我建议添加应返回
false
(例如find("satsuma", "onion")
)的测试用例,以确保您的代码以及应返回true
的调用均能正常工作。最后一条建议是风格化的,这样布置您的代码将使您正在测试的布尔表达式更加明显,而无需求助于临时变量并与
1
进行比较:int main()
{
std::string s;
if (find("Mississippi", "sip"))
{
s = "true";
}
else
{
s = "false";
}
std::cout << s << std::endl;
}
祝您上课好运!
关于c++ - 这是使用递归的正确方法吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8393749/