Hola señores, soy nuevo en el tema y estoy aprendiendo poco a poco. Tengo un problema con dos programas. Los siguientes:
a) Una función es_potencia_de_dos
que reciba como parámetro un número natural, y devuelva True
si el número es una potencia de 2
, y False
en caso contrario.
b) Una función que, dados dos números naturales pasados como argumentos (parámetros de la función), devuelva la suma de todas las potencias de 2
que hay en el rango formado por esos números (0
, si no hay potencia de 2
entre ellos). Utilice la función es_potencia_de_dos()
del ejercicio anterior.
Pueden brindarme su tiempo, ¡sería de grande ayuda!
Respuestas
Aunque nos pides ayuda con dos ejercicios, te voy a explicar solamente cómo resolver el primero. El motivo es que si te resuelvo los dos, nunca aprenderás a programar por tu cuenta. Así que por favor, intenta resolver el segundo ejercicio por tu cuenta y nos vas diciendo los problemas que tienes y cómo podemos ayudarte.
Para resolver el primer problema, la solución típica que aplicaría cualquier programador que empieza con Python sería lo siguiente:
def es_potencia_de_dos(numero): if numero < 1: return False if numero <= 2: return True i = 2 while True: i *= 2 if i == numero: return True if i > numero: return False
El resultado de ejecutar esta función:
print es_potencia_de_dos(0); # False print es_potencia_de_dos(1); # True (2^0) print es_potencia_de_dos(2); # True (2^1) print es_potencia_de_dos(6); # False print es_potencia_de_dos(8); # True (2^3) print es_potencia_de_dos(13); # False
Utilizar un bucle while
para recorrer todos los números desde 2
hasta el número que queremos comprobar es muy sencillo desde el punto de vista de la programación, pero es poco eficiente.
Una forma más elegante de resolver este problema sería hacer uso de los logaritmos que aprendimos en matemáticas. La solución quedaría así:
from math import log, floor def es_potencia_de_dos(numero): if numero < 1: return False i = log(numero, 2) return 0 == (i - floor(i))
Esta solución es mucho más eficiente que la anterior, pero todavía podemos hacerlo mejor. Gracias a las operaciones con bits que aprendimos en alguna otra asignatura, podemos ejecutar lo siguiente:
def es_potencia_de_dos(numero): if numero < 1: return False return 0 == (numero & (numero - 1))
Esta solución es, con mucha diferencia, la más eficiente de todas desde el punto de vista de la programación. Eso sí, al principio no es nada fácil entender cómo funciona. En este artículo puedes encontrar una explicación de cómo funciona. Aunque el artículo esté escrito para Ruby en vez de para Python, la explicación sirve para cualquier caso.
@javiereguiluz
Necesito ayuda con este ejercicio.
lea 10 números por teclado 5 para una lista y 5 para otra lista distinta. Almacene ambas lista en una sola y luego ordenela de forma ascendente
@nirujoC9