回文递归:简化条件三元表达式

Palindrom recursion: Simplify conditional ternary expression

我需要实现一个递归方法来检查输入是否为回文。我能够在一行中做到这一点并且它有效,但我不确定它的可读性如何。我也不断收到一条消息“简化条件三元表达式”,但我不确定如何 这是我的代码:

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]);
    }
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 : falsereturn expression.

这肯定不好看,但我想这是为了学校练习?

how readable this is

首先,命名约定:删除标识符的 unnecessary/uninformative 部分。例如,参数 而不是 需要以 i_ 开头(大概是表示“输入”?)。这里没有传达任何信息,它增加了噪音。这对可读性有 巨大 影响。

逻辑本身也可以整理。您收到的警告提示您可以简化条件 - 当您的条件包含布尔文字时,情况总是如此。

然而,最重要的是,可读性将受益于将表达式分解为多行。

我也会交换两个次要条件,这样你 first 测试当前字符,然后 then 进一步递归(仅当当前测试的两个字符相等!):

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)
        );
}