算二进制递归?

时间:2015-12-06 19:13:19

标签: java recursion binary

编写一个方法countBinary,它接受一个整数n作为参数,并打印所有具有n位数的二进制数字,并在一个单独的行上打印每个值。应显示所有数字的所有n位数,包括必要时的前导零。您可以假设n是非负数。如果n为0,则应生成空行输出。不要在解决方案中使用循环;递归地实现它。

我遇到的问题是我不知道如何打印0和1,因为n是我可以拥有的唯一参数。我也不能使用for循环并将我的递归调用放在循环中,所以我有点卡住了。这就是我到目前为止所做的:

<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="post" class="form" role="form">

    <select style="font-size:1.5em; height:45px;" class="form-control" name="listings" >
       <option>Choose Color</option>
       <option value="GradeA" <?php if($listings == "GradeA") print('selected="selected"'); ?>>GradeA</option>
       <option value="GradeB" <?php if($listings == "GradeB") print('selected="selected"'); ?>>GradeB</option>
    </select>

     <div class="form-group">
      <center>
      <button style="height:45px; font-weight:bold;" name="submit_form" class="form-control btn btn-lg btn-info">
        Next
      </button>
      </center>
     </div>

     </form> 

}

这是我对countBinary(2)的输出:

    public static void countBinary(int n){
if (n < 0) {
    throw new IllegalArgumentException();
}if(n == 0){
    System.out.print("");
}else{
    countBinary(n - 1);
    System.out.println(n ); // I tried doing n + "0" and + "1" did not work
    countBinary(n - 1 );
    System.out.print(n );
   // store += n;

}

应该如此:

    1
   12
    1
   12

我得到了适量的&#34;等级&#34;对于其他任何奇怪的行,但我真的卡住了

注意:这不是作业,只是练习。谢谢!

2 个答案:

答案 0 :(得分:1)

你在两次递归的过程中走在正确的轨道上。这个概念是打印一个&#34; 0&#34;接着是(n-1) - 位数字,然后是&#34; 1&#34;后跟一个(n-1)位数字。诀窍是弄清楚如何处理这样一个事实:对于n > 1,有许多(n-1)个数字,并且每个都需要有#34; 0&#34;或&#34; 1&#34;在他们面前。处理它的方法是不实际打印&#34; 0&#34;或&#34; 1&#34;但是要将它传递给递归,直到你准备好打印每一行。为此,您需要一个辅助方法来进行实际的递归,到目前为止,您可以使用char[]StringBuilder甚至String作为待处理的输出。 (我使用第一个和第二个也很好。我不会使用String,因为每次你需要添加一个&#34时它会生成一个新的String ; 0&#34;或&#34; 1&#34; - 很多垃圾。)

这是我的解决方案:

public static void countBinary(int n){
    if (n < 0) {
        throw new IllegalArgumentException();
    }
    countBinary(new char[n], n);
}

private static void countBinary(char[] prefix, int n) {
    if (n == 0) {
        // base case -- no more recursion
        System.out.println(prefix);
    } else {
        // position next digit counting from the right so output is in increasing order
        final int i = prefix.length - n;

        // prefix a '0' and recurse
        prefix[i] = '0';
        countBinary(prefix, n-1);

        // prefix a '1' and recurse
        prefix[i] = '1';
        countBinary(prefix, n-1);
    }
}

答案 1 :(得分:0)

我不相信“不做作业”的事情,但无论如何。
您想通过递归打印二进制数。仅将n作为单个参数,我们无法做到这一点。因为如果我们想要打印多个n数字,并且先输入x个数字,然后让递归添加oder y,我们需要知道第一个x数字在哪里。
这意味着,如果有人告诉我:“打印所有带有n数字的二进制数字”,我说:很好,这可以通过递归打印所有带有n数字的数字并在它们之前添加“”来完成。

  • 现在当有人要我打印所有带有n位数字并在其前面添加“s”的数字时,我会告诉其他人“请打印所有带有n-1位数和”s“的二进制数字并且前面有0“因为我的电话号码可能以0开头。
  • 之后我告诉其他人“请打印所有二进制数字,其中n-1位数字和”s“以及1位于其前面”因为我的nubmer也可能以{{1}开头}。

这转换为代码如下:

1