Dado un entero positivo n, cuente todos los números binarios de n dígitos sin ningún número consecutivo 1's.

por ejemplo, para n = 5, los números binarios que satisfacen las restricciones dadas son: [00000, 00001, 00010, 00100, 00101, 01000, 01001, 01010, 10000, 10001, 10010, 10100, 10101].

Practice this problem

 
Una solución simple sería generar todos los números enteros de n dígitos e imprimir solo aquellos números enteros que satisfagan las restricciones dadas. La complejidad de esta solución sería exponencial.

 
Una mejor solución es generar solo aquellos números enteros de n dígitos que satisfagan las restricciones dadas. La idea es usar recursión. anexamos 0 y 1 al número parcialmente formado y recurren con un dígito menos en cada punto de la recursión. Aquí, el truco es añadir 1 y se repite solo si el último dígito del número parcialmente formado es 0. De esa manera, nunca tendremos ninguna consecutiva. 1's en la string de salida.

A continuación se muestra la implementación de la idea en C++, Java y Python:

C++


Descargar  Ejecutar código

Resultado:

The total number of 5–digit binary numbers without any consecutive 1’s is 13

Java


Descargar  Ejecutar código

Resultado:

The total number of 5–digit binary numbers without any consecutive 1’s is 13

Python


Descargar  Ejecutar código

Resultado:

The total number of 5–digit binary numbers without any consecutive 1’s is 13

La complejidad temporal de la solución anterior es exponencial y ocupa espacio en la pila de llamadas.

 
El problema tiene un subestructura óptima y exhibiciones subproblemas superpuestos. Si dibujamos el árbol de recurrencia de la solución, podemos ver que los mismos subproblemas se calculan repetidamente. Sabemos que los problemas con subestructura óptima y subproblemas superpuestos se pueden resolver mediante programación dinámica, en la que las soluciones de los subproblemas se memorizan en lugar de calcularse repetidamente.

El algoritmo se puede implementar de la siguiente manera en C++, Java y Python, donde primero resolvemos los subproblemas más pequeños y luego resolvemos los subproblemas más grandes a partir de ellos.

C++


Descargar  Ejecutar código

Resultado:

The total number of 5–digit binary numbers without any consecutive 1’s is 13

Java


Descargar  Ejecutar código

Resultado:

The total number of 5–digit binary numbers without any consecutive 1’s is 13

Python


Descargar  Ejecutar código

Resultado:

The total number of 5–digit binary numbers without any consecutive 1’s is 13

La complejidad temporal de la solución anterior es O(n) y requiere O(n) espacio adicional, donde n es el número total de dígitos.

¿Cómo imprimir todos los números binarios?

El siguiente código recursivo en C++, Java y Python también imprime todos los números binarios:

C++


Descargar  Ejecutar código

Resultado:

00000 00001 00010 00100 00101 01000 01001 01010 10000 10001 10010 10100 10101

Java


Descargar  Ejecutar código

Resultado:

00000 00001 00010 00100 00101 01000 01001 01010 10000 10001 10010 10100 10101

Python


Descargar  Ejecutar código

Resultado:

00000 00001 00010 00100 00101 01000 01001 01010 10000 10001 10010 10100 10101