Given strings
s
andt
compute recursively, ift
is contained ins
returntrue
.Example:
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
。
我建议您提高编译器的警告级别,以便在必须调试之前捕获此类问题。
顺便说一句,我发现在每个代码块周围使用大括号,即使是单行代码块,也能帮助我避免此类错误。
您的代码中还有其他错误。从 find()
中删除魔数(Magic Number) 2
和 3
会鼓励您思考它们代表什么,并为您指明正确的道路。
您希望 start == t && find(s.substr(3), t)
工作吗?如果您可以用通俗易懂的英语(或您的母语)表达算法,那么您就更有可能用 C++ 表达它。
此外,我建议添加应返回 false
的测试用例(例如 find("satsuma", "onion")
)以确保您的代码也能正常工作作为应返回 true
的调用。
最后一条建议是风格化的,像这样布置代码将使您正在测试的 bool 表达式更加明显,而无需求助于临时变量并与 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/