Foros Python

Versión completa: Problemas con bucles
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Estimados, buenas tardes.
Estoy haciendo algunos ejercicios en la web, pero no tengo acceso a ningun recurso de consultas, asi que recurro al foro a ver si alguien me hecha una mano...
Sucede que para un numero n debo encontrar la potencia de 2 cuyo resultado se acerque (pero no supere) al numero n.
Es decir, si tengo n = 16, la maxima potencia de 2 seria 4 donde 2 elevado a la potencia 4 daria 16.
Para esto necesito un bucle, en mi caso use For, pero sucede que mi codigo recorre todo el bucle, pero no siempre me da el resultado deseado.
Copio y pego lo que he hecho a ver si alguien detecta el error.

def exponente(n):
    n= int(n)
    for i in range(n):
        print("para i = ",i)
        if i**2<=n:
            result=i
        else:
            i=i+1
    return(result)
print(exponente(16))


---****  ----   el resultado de los dos print es:  

para i =  0
para i =  1
para i =  2
para i =  3
para i =  4
para i =  5
para i =  6
para i =  7
para i =  8
para i =  9
para i =  10
para i =  11
para i =  12
para i =  13
para i =  14
para i =  15
3


Desde ya quedo muy agradecido!!!
Hola, Alex.

Tu código lo veo bien. De hecho, al probar la función exponente(16) obtengo 4 como resultado, lo cual es correcto. Lo que se podría hacer es reemplazar el i=i+1 por un break, palabra reservada que interrumpe la ejecución de un bucle for o while:

Código:
def exponente(n):
    n= int(n)
    for i in range(n):
        print("para i = ",i)
        if i**2<=n:
            result=i
        else:
            # Terminar el bucle.
            break
    return(result)
print(exponente(16))

Además, el valor de la variable i es asignado automáticamente por Python, no es necesario sumarlo en cada iteración del bucle. También tené en cuenta que range(n) genera números desde 0 hasta n-1. Sobre la función range() podés chequear este recurso: https://micro.recursospython.com/recurso...range.html.

Saludos
Francisco, como estas?
Primero que nada muchas gracias por tomarte la molestia en contestarme.
No sabia lo del "break", ya lo incorporé a mi cuaderno.
Sabes que aun sigo con problemas con esto, por ejemplo, aumente el numero n a 64, y la funcion me arroja como resultado potencia 8, cuando en realidad deberia ser 6.
Y para 128 me arroja 11 cuando deberia ser 7.
Sinceramente me esta ganando....
Hola, Alex.

No había entendido que debía buscar la potencia de dos. En tu código estás buscando los números que elevados al cuadrados se acercan al argumento:

Código:
if i**2 <= n:

Pero en realidad querés buscar los exponentes, de modo que debería ser:

Código:
if 2**i <= n:

Saludos
Hola Francisco.
No puedo creer que no haya visto ese error tan simple!!
Muchas gracias por tu tiempo.
Saludos!!