Luchando con un ejercicio que me pide que escriba a ** b sin este operador. Intenté escribir algo yo mismo pero no obtengo resultados correctos. En lugar de un valor obtengo dos, ambos incorrectos. Parece que el contador no aumenta realmente. ¿Puedo pedir ayuda? ¡Gracias!

def powerof(base,exp):
  result=1
  counter=0
  # until counter reaches exponent, go on
  if counter<=exp:
    # result multiplies itself by base, starting at 1
    result=result*base
    # increase counter
    counter=counter+1
    return result
    return counter  # here it says "unreachable code". Can I not return more variables at the same time?
  else:     # counter already reached exponent, stop
    return

# I want to print 2**8. Suprisingly getting two (incorrect) values as a result
print(powerof(2,8))
0
Jewenile 17 feb. 2017 a las 17:06

4 respuestas

La mejor respuesta

Implementación ingenua (no es la mejor solución, pero creo que deberías poder seguir esta):

def powerof(base, exp):
    results = 1
    for n in range(exp):
        results *= base
    return results


print(powerof(5,2))

Espero que ayude.

1
Tshilidzi Mudau 18 feb. 2017 a las 23:58

Sin duda recomendaría la recursividad también, pero obviamente esa no es una opción ;-)

Entonces, tratemos de arreglar su código. ¿Por qué estás tratando de devolver algo en tu declaración if?

return result
return counter  # here it says "unreachable code". Can I not return more variables at the same time?

¿Sabes que cuando regresas, sales de tu función? Esto no es lo que quisiste decir. Lo que supongo que quieres es multiplicar result siempre que no lo hayas hecho exp veces. En otras palabras, desea repetir el código dentro de su declaración if hasta que lo haya hecho exp veces. Tiene una palabra clave para eso: while. Y while ciertamente incluye esa condición que trataste de proporcionar con tu if.

¡Buena suerte!

Editar: por cierto, no entiendo por qué dices que estás obteniendo dos resultados. Esto es sospechoso, ¿estás seguro de eso?

0
Nicolas Garnier 17 feb. 2017 a las 14:23

Puede resolver la tarea "elevar a a la potencia de b sin usar a**b" de una de las siguientes maneras:

>>> a, b = 2, 8
>>>
>>> pow(a, b)
>>> a.__pow__(b)
>>>
>>> sum(a**i for i in range(b)) + 1  # Okay, technically this uses **.
>>>
>>> import itertools as it
>>> from functools import reduce
>>> import operator as op
>>> reduce(op.mul, it.repeat(a, b))
>>>
>>> eval('*'.join(str(a) * b))  # Don't use that one.
0
a_guest 19 jul. 2019 a las 22:20

Prueba con recursividad:

def powerof(base,exp):
    if exp == 0:
        return 1
    if exp == 1:
        return base
    return base * powerof(base, exp-1)

# I want to print 2**8. Suprisingly getting two (incorrect) values as a result
print(powerof(2,8))

Entonces, lo que hace, se llama a sí mismo mientras disminuye el exponente, por lo que la llamada se verá así: 2 * (2 * (2 * 2))) ... cuando se ejecuta. También podría hacer esto en un ciclo for, pero la recursividad es más compacta.

2
Tobias G 17 feb. 2017 a las 14:09