Вопрос изменился с тех пор, как я написал свой ответ.
Мои комментарии касаются кода, который выглядел так (и может повторить) ...
#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;
}
Удачи в вашем классе!