2011-01-19 9 views
6

Actualmente estoy usando singpath.com a practicar en mi pitón, pero se enfrentan a un problema con un problema:averiguar si a es una potencia de b

un número, una, es una potencia de b si es divisible por by a/b es un poder de b. Escribe una función llamada is_power que toma los parámetros a y b y devuelve True si a es una potencia de b.

def is_power(a,b): 
    c = a/b 
    if (((a%b) == 0) and ((c%b) == 0)): 
     return True 
    else: 
     return False 

Above es mi solución pero el sistema me pide que generalice mi solución. ¿Alguien puede decirme qué pasa con mi solución?

+0

Realmente no necesita ** un solo paréntesis ** en su 'si'. Son 10 teclas innecesarias que dificultan la lectura del código. –

Respuesta

0

No diría que lo generalice. Diría que lo corrija, ya que es incorrecto. Usando su solución is_power (12,2) devuelve True como lo hace is_power (18,3).

Creo que la razón por la que el sistema dice que es generalizar es que probablemente funcione correctamente para algunos de sus casos de prueba, pero no para otros. Es probable que los casos de prueba para los que está funcionando coincidan con aquellos para los que funcionaría si estuvieran codificados de una determinada manera (solo comprobando potencias de 2, por ejemplo).

1

Usted solo está revisando las primeras dos potencias: a divide b y a/b divide b. Podría ser que a = b ** 3 o b ** 4 (o b ** n en general), por lo que la solución real deberá incluir la recursión o un ciclo.

0

Estás mirando si a/b es divisible por b (en la expresión (c%b) == 0), en lugar de si a/b es una potencia de b. Sugerencia: ¿Qué función llamaría para ver si algo es una potencia de b?

0

Para comprender la recursión, primero necesita comprender la recursión.

def is_power(a, b): 
    if a < b: # 3 is never a power of 10, right? 
     return False # prevent recursion 
    if a == b: # a is always a**1, right? 
     return True # prevent recursion 
    else: 
     return is_power(a/b, b) # recursion! 

Tenga en cuenta que para los enteros a/b le dará errores de redondeo. Asegúrate de pasar flotadores.

+0

1 es una potencia de 5 sin embargo: p –

+0

Sí, debería haber incluido una verificación 'b == 0'. – 9000

+0

También cada número positivo es una potencia flotante de cualquier número positivo ... por lo que no puede usar flotadores. –

0

No creo que tenga la implementación correcta. Con base en el problema, la función is_power debería ser algo como esto:

def is_power(a,b): 
    if a%b == 0 and is_power(float(a)/float(b), b): 
     return True 
    else: 
     return False 
8

La razón por lo cual su código original no funciona es la siguiente: Usted acaba de comprobar (c%b) == 0) aka (a/b) is divisible by b, que es mucho más débil que la parte a/b is a power of b de la definición.

Cuando desee resolver un problema como este, siempre debe comenzar con casos triviales. En este caso, hay dos casos: is_power(x,x) y is_power(1,x) - en ambos la respuesta es True, porque x**1==x y x**0==1.

Una vez que tenga estos casos cubiertos solo necesita escribir el resto de la definición. Escriba el código para (a is divisible by b) and (a/b is a power of b) y póngalo todo junto.

La función final se verá así:

def is_power(a,b): 
    if <trivial case 1> or <trivial case 2>: 
     return True 
    # its a recursive definition so you have to use `is_power` here 
    return <a is divisible by b> and <a/b is a power of b> 

La única pregunta que queda es cómo responder <a/b is a power of b>. La forma más fácil de hacerlo es usar la función is_power en sí misma; esto se denomina recursividad.

+0

Esta es una respuesta correcta al problema que está tratando de resolver, pero no es una respuesta a su pregunta, que era preguntar qué le pasaba a su código, no cómo escribir un código diferente que resuelva el problema. –

+0

Ok, he agregado un poco más de explicación. –

0

Puede usar el registro.

import math 

def is_power(a, b): 
    return math.log(a, b) % 1 == 0 
+0

'math.log' puede no ser numéricamente estable. –

0
def is_power(a,b): 
    if a == b: 
     return True 
    if a % b == 0 and is_power(a/b,b): 
     return True 
    return False 

La condición final que es a == b es crucial aquí que se detiene cuando ambos números son iguales. Si esto no está incluido, la función podría mostrar False incluso para números legítimos al dividir a/b en la siguiente iteración, que da 1 donde 1% b = 1 que a su vez devuelve False en lugar de True.

+2

Intenta ofrecer alguna explicación para tu respuesta en lugar de solo proporcionar un bloque de código. Ayudará a otros usuarios a comprender la respuesta en lugar de corregir un problema localizado. ¡Gracias! – Conner

+0

También debe manejar el caso donde 'b' es cero pero' a' no es porque entonces 'a% b == 0' arrojará una excepción para la división por cero que usted no capta. – rbaleksandar

0

que está respondiendo a la primera restricción, pero no a la segunda,
comprobar para ver que (a/b)%b == 0 que es un caso especial de "(a/b) is a power of b". para ello el error de generalización (trato de pensar en generalizar ese caso específico

Lo que escriba no es una solución a is power of por ejemplo, podrá indicar 12 como una potencia de 2 desde:.

  • 12%2 = 0,
  • (12/2)%2 = 0

Pero eso es claramente erróneo.

Como han dicho otros, piense en la recursión (o la solución de bucle menos preferible).

0

Yo mismo estaba trabajando en esta pregunta, y esto es lo que se me ocurrió.

Para escribir esto como una función recursiva, necesita la parte recursiva y la parte trivial. Para la parte recursiva, un número es el poder de otro número si:

((a%b)==0) and (is_power(a/b, b) # a is evenly divisible by b and a/b is also a power of b. 

para el caso trivial, b es una potencia de a si a=b.

Sin embargo, no hemos terminado. Debido a que estamos dividiendo por b, debemos hacer una excepción cuando b es zero.

Y la otra excepción es cuando b = 1. Dado que cuando b=1, a/b es a, terminaremos con recursión infinita.

lo tanto, poner todo junto:

def is_power(a,b): 
    # trivial case 
    if (a==b): return True 

    # Exception Handling 
    if (b==0) or (b==1): return False # unless a==b==0 or a==b==1, which are handled by the trivial case above 

    # recursive case 
    return ((a%b)==0) and (is_power(a/b,b)) 
0

Este ejemplo debería solucionar su problema:

def is_power(a,b): 
if a == 1: 
    return True 
elif a%b == 0 and is_power(a/b, b) == True: 
    return True 
else: 
    return False 
+0

-1 para código redundante. La parte 'is_power (a/b, b) == True' es redundante. 'is_power (a/b, b)' ya devuelve un valor booleano. –

0

Aquí está mi solución.

def is_power(a,b): 
if a == 1: # base case for recursion 
    return True 
elif b == 0 or a%b !=0 or a<b: # exception cases. 
    return False 
return is_power(a//b,b) # recursion 

I probado con varios casos (16,2), (6,2), (1,2), (0,0), (0,1) y funciona bien.

0

Una solución mucho más simple es:

def is_power(a, b): 
    while a % b == 0: 
     a //= b 
    return a == 1 

recursividad realmente no es necesario para este problema. Además, la recusión puede causar un error de límite de recursión si a = b ** 1001.

+0

¿Cuál es el propósito de esta declaración? a // = b – Kris1511

Cuestiones relacionadas