编写一个方法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;对于其他任何奇怪的行,但我真的卡住了
注意:这不是作业,只是练习。谢谢!
答案 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