以下是打印n
等于3
的二进制数的所有可能性的代码:
public class Main {
static void binary(int N, int[] A) {
if(N < 1)
System.out.println(Arrays.toString(A));
else
{
A[N-1] = 0;
binary(N-1,A);
A[N-1] = 1;
binary(N-1,A);
}
}
public static void main(String[] args) {
int[] a = new int[3];
binary(3,a);
}
}
代码完美无缺。我能够看到有两个递归调用,我无法理解这是如何工作的。为什么需要两个递归调用?
答案 0 :(得分:3)
每增加一位,将可能值的数量乘以2次。这意味着你有
0 and 1 - first bit
then 00 10 and 01 11 - second bit
then 000 100 010 110 and 001 101 011 111 - third bit and so on
因此,对于每个调用,您应该再处理两个以处理下一位的可能值(0和1)
答案 1 :(得分:1)
要获得某些长度的所有可能的二进制表示,可以将其视为值为0或1的位数组。
递归可以通过以下一厢情愿来解释 - 假设我们可以生成长度为N-1的所有二进制表示,我们如何生成长度为N的所有二进制表示?答案 - 在所有N-1表示的开头附加0,并将该列表添加到通过在所有N-1表示的开头附加1创建的列表。通过进行两次方法调用可以获得这种一厢情愿的想法。
让我们了解这个程序对N = 2的操作方式:我们会将数组的值注意为[?,?]: