Тест рекурсивного палиндрома

У меня есть прототип ограничения 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;
}

но, похоже, он проверяет, совпадает ли первый символ с последним. Я думаю, это потому, что мой массив (начальная точка) не увеличивается, но я не уверен, почему.

1

Решение

Я полагаю, это из-за глубокой неприязни к if заявления, но если бы это было до меня, я бы написал код примерно так:

bool pal(char *str, size_t len) {
return len <2 || (str[0] == str[len-1] && pal(str+1, len-2));
}
4

Другие решения

Вот рабочая версия вашего кода.

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.
}
4

Ваша главная проблема в том, что вы ничего не делаете с результатом рекурсивного вызова:

 if(*str == str[length - 1])
{
pal(str+1, length-1);
}

должно быть должно быть:

 if(*str == str[length - 1])
{
return pal(str+1, length-1);
}

Вам также необходимо проверить наличие таких строк, как строка нулевой длины или строка с одним символом.

1

Вы проверяете первый и последний символ, поэтому вы должны уменьшить длину на 2, а не на 1. Кроме того, вы должны вернуть значение внутреннего вызова приятеля, а не выбрасывать его.

if(*str == str[length - 1])
{
return pal(str + 1, length - 2);
}

Дополнительный тест для длины, равной> = 2 и str, не равной нулю, тоже будет в порядке.

1
По вопросам рекламы [email protected]