【问题标题】:Palindrom recursion: Simplify conditional ternary expression回文递归:简化条件三元表达式
【发布时间】:2020-04-21 10:19:24
【问题描述】:

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

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

【问题讨论】:

  • 我们只允许使用 1 个退货声明
  • 请澄清您的问题。您在三元表达式简化方面需要帮助吗?

标签: c# recursion palindrome conditional-operator simplify


【解决方案1】:

可读性如何

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

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

然而,最重要的是,将表达式分成多行会提高可读性。

我还将交换两个辅助条件,以便您首先测试当前字符,然后然后进一步递归(前提是当前测试的两个字符相等! ):

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

【讨论】:

  • 谢谢!!命名约定在我的课程中是必须的,以便能够更好地阅读长代码。
【解决方案2】:
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

这当然不容易,但我认为这是为了学校练习?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    • 1970-01-01
    • 2019-02-10
    • 1970-01-01
    • 1970-01-01
    • 2012-07-20
    • 2019-10-27
    相关资源
    最近更新 更多