Почему у меня не работает функция палиндрома? - PullRequest
0 голосов
/ 24 февраля 2019

По какой-то причине моя функция палиндрома не работает, я хотел бы помочь с ней:

Код

int Pal(char *s, int a, int b)
{
    if (a>= b)
        return 1;

    if (s[a] != s[b])
        return 0;

    return Pal(s, ++a , --b);
} 

int main()
{
    char *s = "civic";

    if (Pal(s , 1, strlen(s)))
        printf("YES\n");
    else
        printf("No\n");
}

Он продолжает печатать «Нет», и я не понимаю, почему это происходит.

Ответы [ 3 ]

0 голосов
/ 24 февраля 2019

Используйте следующий код:

bool isPalindrome(char *str, int startIndex, int endIndex)
{
  if ( startIndex >= endIndex)
    return true;

  if (str[startIndex] != str[endIndex])
    return false;

  return isPalindrome(str, ++startIndex , --endIndex);
} 
int main()
{
  char *str = "civic";

  if (isPalindrome(str , 0, strlen(str)-1))
    printf("YES\n");
  else
    printf("No\n");
}

Некоторые моменты для рассмотрения

  1. символьные массивы используются для строки в C.
  2. Массивы в C имеют начальный индекс из 0
  3. Массивы в C endIndex равен размер - 1 .

Другие улучшения возможны, хотя они очень незначительны:

  1. Имеют returnType рекурсивной функции в качестве логического значения (меньше памяти).
  2. Есть более четкие имена длячлены данных.

Пример:

char string[]={'c,'i','v','i','c'};  //size=5
// indexes:     0  1   2   3   4
0 голосов
/ 27 февраля 2019

Символ в позиции strlen(s) - это не последний символ в строке , а символ \0, обозначающий его конец.Если вы хотите сравнить с последним, измените

    if (Pal(s , 1, strlen(s)))

на

    if (Pal(s , 0, strlen(s)-1))

(но сначала убедитесь, что строка s имеет хотя бы один символ, иливыражение будет неправильным --- вы не можете проверить палиндром на пустую строку ---)

Строковые индексы идут от 0 до одного символа, который меньше strlen(s).

0 голосов
/ 24 февраля 2019

Ваша начальная точка для функции неверна:

if (Pal(s , 1 ,strlen(s) ))

Массивы в C и C ++ имеют начальный индекс 0. Таким образом, вы фактически начинаете со второго символа и заканчиваете нулемзавершающий байт в конце строки.

Используйте значение на 1 меньше как для начала, так и для конца:

if (Pal(s, 0, strlen(s)-1 ))
...