Для начинающих функция в любом случае некорректна. Например, для строки "1231"
функция возвращает true
. Я надеюсь, что вы можете проверить это сами.
Эта часть функции
if (tempCleanText.at(firstChar) == tempCleanText.at(lastChar))
{
palindromeCheck(tempCleanText, ++firstChar, --lastChar);
}
else
{
return false;
}
return true; // Keeping this in works
должна быть по крайней мере заменена следующим фрагментом кода
if (tempCleanText.at(firstChar) == tempCleanText.at(lastChar))
{
return palindromeCheck(tempCleanText, ++firstChar, --lastChar);
}
else
{
return false;
}
То есть это оператор return
return true; // Keeping this in works
должен быть полностью удален.
Что касается вашего вопроса, то без последнего оператора return у функции будет неопределенное поведение, потому что она ничего не возвращает после оператора if. То есть оператор if
if (tempCleanText.at(firstChar) == tempCleanText.at(lastChar))
{
palindromeCheck(tempCleanText, ++firstChar, --lastChar);
}
else
{
return false;
}
был успешно выполнен при условии, что
tempCleanText.at(firstChar) == tempCleanText.at(lastChar))
, и что возвращает функция после выполнения подоператора оператора if? Ничего! :)
Также не имеет смысла объявлять два дополнительных параметра (индекса) помимо самой строки, потому что в любом случае строка передается по значению, и вы всегда можете получить ее размер, вызвав функцию-член size()
.
Я могу предложить следующую реализацию функции Аналогично вашей функции эта реализация функции возвращает true в случае пропуска пустой строки.
#include <iostream>
#include <iomanip>
#include <string>
#include <cctype>
bool palindromeCheck( std::string s )
{
if ( s.size() < 2 )
{
return true;
}
else if ( ispunct( ( unsigned char )s.front() ) || isspace( ( unsigned char )s.front() ) )
{
return palindromeCheck( s.substr( 1 ) );
}
else if ( ispunct( ( unsigned char )s.back() ) || isspace( ( unsigned char )s.back() ) )
{
return palindromeCheck( s.substr( 0, s.size() - 1 ) );
}
else if ( s.front() == s.back() )
{
return s.size() == 2 ? true : palindromeCheck( s.substr( 1, s.size() - 2) );
}
else
{
return false;
}
}
int main()
{
std::cout << std::boolalpha << palindromeCheck( "" ) << '\n';
std::cout << std::boolalpha << palindromeCheck( "1" ) << '\n';
std::cout << std::boolalpha << palindromeCheck( "1 1" ) << '\n';
std::cout << std::boolalpha << palindromeCheck( "1,2,2,1" ) << '\n';
std::cout << std::boolalpha << palindromeCheck( "1 2 3 2 1" ) << '\n';
std::cout << std::boolalpha << palindromeCheck( "12341" ) << '\n';
return 0;
}
Вывод программы:
true
true
true
true
true
false