使用递归翻转二进制数

时间:2016-11-02 17:37:54

标签: java recursion

我正在开发一个项目,用户输入奇数二进制数ex:10101,我应该有一个递归方法,将翻转1和0的ex:101 = 010.由于某种原因我的代码摆脱领先的零使得数字成为一个使程序崩溃的偶数。感谢任何和所有帮助,下面是我的递归类,它应该用于翻转二进制数字。

public static void main(String[] args){
    String num;
    Scanner in = new Scanner(System.in);
    System.out.println("Please enter a Binary number with an odd amount of digits: ");
    num = in.nextLine();
    System.out.println(num);
    int num2 = Integer.parseInt(num);
    System.out.println(num2);
    Recursive2 test = new Recursive2(num2);
    System.out.println(test);


}

这是我测试递归的主要类。

<div class="navbar-header">
            <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>

            <a class="navbar-brand" href="#">
            <img class="header-logo" style="" src="">SF</a>
        </div>

        <div class="collapse navbar-collapse pull-right" id="bs-example-navbar-collapse-1">
            <ul class="nav navbar-nav">
                <li>
                    <a href="#">About</a>
                </li>
                <li>
                    <a href="#">Retrospective</a>
                </li>
            </ul>
        </div>

7 个答案:

答案 0 :(得分:0)

你犯了几个错误:

  • 在调用递归方法之前,确定该数字是奇数还是偶数。目前,您的代码将在最多一次调用后停止,因为您检查了位数。
  • 无需再解析int并再次String。整个过程可以完全用字符串完成。
  • 构造结果应该包括将递归调用的结果附加到表示最后一位反转的字符串的最后一位。
  • 基本情况应该是字符串为空时的情况,而不是字符串只有一个数字时的情况。

修复这些错误将产生正确的实现。

答案 1 :(得分:0)

目前的算法无法修复。

这是一个非常简单的递归算法,它将起作用:

  • 如果字符串为空,则将其返回
  • 如果第一个字符为0,则return "1" + recurse(s.substring(1))
  • 否则(第一个字符为1),return "0" + recurse(s.substring(1))

答案 2 :(得分:0)

问题是你要转换为整数值,它会抛弃前导零。只需处理字符串:

public static void main(String[] args){
    String num;
    Scanner in = new Scanner(System.in);
    System.out.println("Please enter a Binary number with an odd amount of digits: ");
    num = in.nextLine();
    System.out.println(num);
    String flipped;
    if (num.length() % 2 == 0) {
        flipped = "Even number";
    else {
        flipped = Recursive2.recursive(num);
    }
    System.out.println(flipped);
}

Recursive2类只能有static个方法:

public class Recursive2 {
    private static String flip(char c) {
        if (c == '0') return "1";
        return "0"; // assumes characters are all 0 or 1
    }
    public static String recursive(String a) {
        STring tempStr;
        if (a.length() == 0) {
            tempStr = "";
        } else {
            tempStr = flip(a.charAt(0)) + recursive(a.substring(1));
        }
        return tempStr;
    }
}

如果您检测到01以外的字符,则可能需要抛出异常。

编辑:根据你的评论,递归方法可以写成:

public static String recursive(String a) {
    String tempStr = flip(a.charAt(0));
    final int len = a.length();
    if (len > 1) {
        tempStr += recursive(a.substring(1, len - 1)) + flip(a.charAt(len - 1));
    }
    return tempStr;
}

这假设参数是一个奇数长度的字符串。该检查应该在递归方法之外完成,因为如果它是真的一次,则在每次后续递归时都是如此。

答案 3 :(得分:0)

忽略前导零,因为您将输入二进制数转换为整数。对于整数前导零并不意味着什么。您应该只使用String

同样Integer.parseInt(num);会假设您要解析十进制数而不是二进制数。如果您确实要解析二进制数,那么您将不得不使用另一个重载方法Integer.parseInt(String s, int radix)

然而正如我所说,由于前导零,你应该只使用字符串。

答案 4 :(得分:0)

我建议你改为从用户插入的字符串中删除一个数字,然后将其转换(从1反比0反之亦然),然后使用子字符串作为递归函数的传递少了一点。

Hint-&GT;基本情况是a.length()== 0;因为如果你删除一个字符串的数字,你的长度最终会为0.

祝你好运!

答案 5 :(得分:0)

Integer.parseInt(i)会将String转换为Integer值。

Integer 010的{​​{1}}值为10,会导致0's被删除。

将输入作为String使用以避免这种情况。

答案 6 :(得分:0)

使用StringBuilder来避免创建新String,或者您可以使用char数组

public static void main(String[] args) {
    int no = 1234; // some no
    String in = Integer.toBinaryString(no);
    System.out.println("Original " + in);
    System.out.println("Flipped  " + flipBits(in));
}

public static String flipBits(String in) {
    if (in.length() % 2 == 0)
        return "even length";
    return new String(flipBits(in.toCharArray(), in.length() - 1));
}

private static char[] flipBits(char[] ch, int index) {
    if (index < 0) {
        return ch;
    } else {
        ch[index] = Character.forDigit(49 - ch[index], 2); //flip
        return flipBits(ch, index - 1);
    }
}

输出

Original 10011010010
Flipped  01100101101