У меня есть прототип ограничения bool pal(char str[], int length)
и мне нужно проверить, является ли введенная пользователем строка палиндромом или нет. Код у меня есть:
bool pal(char str[], int length)
{
if(*str == str[length - 1])
{
pal(str+1, length-1);
}
else
{
return false
}
return true;
}
но, похоже, он проверяет, совпадает ли первый символ с последним. Я думаю, это потому, что мой массив (начальная точка) не увеличивается, но я не уверен, почему.
Я полагаю, это из-за глубокой неприязни к if
заявления, но если бы это было до меня, я бы написал код примерно так:
bool pal(char *str, size_t len) {
return len <2 || (str[0] == str[len-1] && pal(str+1, len-2));
}
Вот рабочая версия вашего кода.
bool pal(const char* str, int length)
{
if(length <2) return true; // base case - 1 or 0 length string is a palindrome.
if((*str) == str[length - 1])
{
return pal(str+1, length-2); // -2 because 1 from front and 1 from back.
}
else
{
return false;
}
//no return here because the recursive call is returned.
}
Ваша главная проблема в том, что вы ничего не делаете с результатом рекурсивного вызова:
if(*str == str[length - 1])
{
pal(str+1, length-1);
}
должно быть должно быть:
if(*str == str[length - 1])
{
return pal(str+1, length-1);
}
Вам также необходимо проверить наличие таких строк, как строка нулевой длины или строка с одним символом.
Вы проверяете первый и последний символ, поэтому вы должны уменьшить длину на 2, а не на 1. Кроме того, вы должны вернуть значение внутреннего вызова приятеля, а не выбрасывать его.
if(*str == str[length - 1])
{
return pal(str + 1, length - 2);
}
Дополнительный тест для длины, равной> = 2 и str, не равной нулю, тоже будет в порядке.