Aquí es una solución más general, lo que puede crear listas no sólo de dígitos binarios, pero de ningún dígito :-)
package de.fencing_game.paul.examples;
import java.util.Arrays;
public class AllNaryNumbers {
private static void printAll(String prefix, Iterable<String> digits,
int length)
{
if(length == 0) {
System.out.println(prefix);
return;
}
for(String digit : digits) {
printAll(prefix + digit, digits, length-1);
}
}
private static void printNumbers(int length, Iterable<String> digits) {
printAll("", digits, length);
}
private static void printBinary(int length) {
printNumbers(length, Arrays.asList("0", "1"));
}
public static void main(String[] params) {
if(params.length == 0) {
printBinary(5);
return;
}
int len = Integer.parseInt(params[0]);
if(params.length == 1) {
printBinary(len);
return;
}
Iterable<String> digits =
Arrays.asList(params).subList(1, params.length);
printNumbers(len, digits);
}
}
Editar: al usar mi ProductIterable
, el código se hace más corta:
private static void printNumbers(int length, Iterable<String> digits)
{
for(List<String> number :
new ProductIterable<String>
(Collections.nCopies(length, digits))) {
for(String digit : number) {
System.out.print(digit);
}
System.out.println();
}
}
(y la mayor parte es la conversión del Iterable en una cadena). Si podemos vivir con la salida separada por comas, podemos usar un ProductList
y que sea aún más corto:
private static void printNumbers(int length, List<String> digits)
{
System.out.println(new ProductList<String>
(Collections.nCopies(length, digits)));
}
La salida sería algo como esto: [[0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 1, 1], [1, 0, 0], [1, 0, 1], [1, 1, 0], [1, 1, 1]]
.
No es recursiva, pero al menos floja (justo a tiempo) produce los elementos.
Acaba de imprimir los números de 0 a 2^n - 1 en formato binario ... – fredley
Imprime todos los bits de 0 a 2^n (2 potencia n). Esa es la versión iterativa más simple. –
Utilice los viejos ejercicios de topcoder.com para practicar. – yogsma