Рекурсия Палиндрома: упрощение условного троичного выражения - PullRequest
1 голос
/ 21 апреля 2020

Мне нужно было реализовать рекурсивный метод, который проверяет, является ли ввод палиндромом или нет. Я смог сделать это в одну строку, и это работает, но я не уверен, насколько это читабельно. Я также продолжаю получать сообщение " Упрощение условного троичного выражения ", но я не уверен, каков мой код:

private static bool checkIfPalindrome(string i_InputToCheck, int i_StartIndex, int i_EndIndex)
    {
        return (i_StartIndex >= i_EndIndex) ? true : checkIfPalindrome(i_InputToCheck, i_StartIndex + 1, i_EndIndex - 1) && (i_InputToCheck[i_StartIndex] == i_InputToCheck[i_EndIndex]);
    }

Ответы [ 2 ]

1 голос
/ 21 апреля 2020

насколько читабельно это

Прежде всего, соглашение об именах: избавьтесь от ненужных / неинформативных частей идентификаторов. Например, параметры не должны начинаться с i_ (предположительно, для обозначения «ввода»?). Здесь нет никакой информации, и это добавляет шум. Это оказывает огромное влияние на удобочитаемость.

Логи c также могут быть обеззаражены. Получаемое предупреждение дает вам подсказку о том, что условие можно упростить - это всегда тот случай, когда ваши условные выражения содержат логические литералы.

Однако, более всего, читаемость выиграет от разбивания выражения над несколько строк.

Я бы также поменял местами два вторичных условия, чтобы вы сначала протестировали текущие символы, а , а затем продолжили повторение (только если два протестированных в данный момент) символы равны!):

private static bool IsPalindrome(string input, int start, int end) {
    return (start >= end) ||
        input[start] == input[end] &&
        IsPalindrome(input, start + 1, end - 1);
}

Этот код основан на правильном приоритете && над ||. Некоторые люди предпочитают явно указывать этот приоритет операторов, используя больше скобок:

private static bool IsPalindrome(string input, int start, int end) {
    return (start >= end) ||
        (
            input[start] == input[end] &&
            IsPalindrome(input, start + 1, end - 1)
        );
}
1 голос
/ 21 апреля 2020
return i_StartIndex >= i_EndIndex || checkIfPalindrome(i_InputToCheck, i_StartIndex + 1, i_EndIndex - 1) && i_InputToCheck[i_StartIndex] == i_InputToCheck[i_EndIndex];

Упрощение вызвано тем, что вы тестируете логическое выражение, а затем возвращаете логическое значение: if (expression == true) означает то же самое, что просто if (expression) и return expression ? true : false то же самое, что и return expression.

Это, конечно, нелегко для глаз, но я предполагаю, что это для школьного упражнения?

...