首页 文章

奇偶校验 - 递归java

提问于
浏览
1

我有奇偶校验问题:二进制字符串是一个只包含'0'和'1'字符的字符串 . 二进制字符串的奇偶校验定义如下 . 如果字符“1”出现在该字符串中的次数是偶数,则奇偶校验为0;如果它是奇数,则奇偶校验为1.例如,奇偶校验“101”为0,奇偶校验“10110”为1,奇偶校验“001001101”为0.写一个函数,使用签名

public static int parity(String binaryStr)
//no changes are allowed & only use recursive solution, no loops allowed

我设法迭代地写它,但我的递归是outOfboundries:

public static int parity(String binaryStr) {
    int counter = 0;
    for (int i = 0; i < binaryStr.length () ; i++) {
        if (binaryStr.charAt (i) == 49) {
            counter++;
        }
    }
    if ( counter % 2 == 0 ) {
        return 0;
    }
    else {
        return 1;
    }
}

递归:

private static int index = 0;
private static int ans = 0;

private static int parity(String binaryStr) {
    if ( index == binaryStr.length ()-1 ) {
        if ( ans % 2 == 0 ) {
            return 0;
        }
        else {
            return 1;
        }
    }
    else if ( binaryStr.charAt (index) == '1' ) {
        ans++;
        return parity (binaryStr.substring (index++));
    }
    return  parity (binaryStr.substring (index++));
}

请帮我纠正一下

1 回答

  • 2

    您的代码的主要问题是将 binaryStr.substring (index++) 传递给递归调用,该调用传递原始 String 而不是子字符串 . 因此,您将获得无限递归 . 你可以使用 ++index .

    我建议不要使用 static 变量,而是使用以下内容:

    private static int parity(String binaryStr) {
        if (binaryStr.length() == 0) {
            return 0;
        } else {
            return ((binaryStr.charAt(0) == '0') ? 0 : 1) ^ parity(binaryStr.substring(1));
        }
    }
    

    说明:

    如果逐位XOR(^)的两个操作数相等,则返回0.如果一个操作数为0而另一个操作数为1,则返回1 .

    这正是您需要的逻辑:

    如果第一个字符是'1'且 String 的其余部分具有奇偶校验1(即'1'的奇数),则整个 String 的奇偶校验为0 .

    如果第一个字符是'1'且 String 的结果具有奇偶校验0(即偶数'1' s, the whole 字符串'的奇偶校验为1 .

    如果第一个字符是'0',则整个 String 的奇偶校验与 String 的其余部分的奇偶校验相同 .

相关问题