Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Ayuda con dos ejercicios de programación de Python

9 de octubre de 2014

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

#1

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 &amp; (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

9 octubre 2014, 11:13
#2

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

11 julio 2016, 4:04