2011-01-19 11 views
6

obecnie używam singpath.com ćwiczyć na mojej pytona, ale twarz problem z problemem:Dowiedzieć się, czy jest potęgą b

Szereg, a, jest potęgą B, jeśli jest podzielny przez b, a/b jest potęgą b. Napisz funkcję o nazwie is_power, która przyjmuje parametry aib i zwraca True, jeśli a jest potęgą b.

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

Powyżej jest moje rozwiązanie, ale system zachęca mnie do uogólnienia mojego rozwiązania. Czy ktoś może mi powiedzieć, co jest nie tak z moim rozwiązaniem?

+0

Naprawdę nie potrzebujesz ** pojedynczego nawiasu ** w twoim 'if'. To 10 niepotrzebnych naciśnięć klawiszy, które utrudniają odczyt kodu. –

Odpowiedz

0

Nie powiedziałbym, żeby to uogólnić. Powiedziałbym, żeby to poprawić, ponieważ jest niepoprawne. Za pomocą twojego rozwiązania is_power (12,2) zwraca True tak jak is ispower (18,3).

Myślę, że powodem, dla którego system mówi, że można to uogólnić, jest to, że prawdopodobnie działa prawidłowo w niektórych przypadkach testowych, ale nie w innych. Jest prawdopodobne, że przypadki testowe, dla których działa, są przypadkowo tymi, dla których działałoby, gdyby były zakodowane w określony sposób (na przykład tylko sprawdzanie uprawnień 2).

1

Sprawdzasz tylko pierwsze dwie potęgi: a dzieli b i a/b dzieli b. Może to być a = b ** 3 lub b ** 4 (lub b ** n w ogóle), więc rzeczywiste rozwiązanie będzie wymagać rekursji lub pętli.

0

jesteś sprawdzanie czy a/b jest podzielna przezb (w wyrażeniu (c%b) == 0), a nie czy a/b jest mocb. Podpowiedź: Jaką funkcję wywołasz, aby sprawdzić, czy coś jest potęgą b?

0

Aby zrozumieć rekursję, musisz najpierw zrozumieć rekursję.

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! 

Zauważ, że dla liczb całkowitych a/b daje błędy zaokrąglania. Upewnij się, że przekazałeś pływaki.

+0

1 to potęga 5 jednak: p –

+0

Tak, powinienem uwzględnić sprawdzanie "b == 0". – 9000

+0

Także każda liczba dodatnia jest potęgą pływającą o dowolnej liczbie dodatniej ... więc nie można używać pływaków. –

0

Nie sądzę, że masz odpowiednią implementację. Opierając się na problemie, funkcja is_power powinien wyglądać mniej więcej tak:

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

Powodem powód oryginalny kod nie działa to: po prostu sprawdzić (c%b) == 0) aka (a/b) is divisible by b, który jest znacznie słabszy niż a/b is a power of b części definicji.

Jeśli chcesz rozwiązać problem taki jak ten, zawsze powinieneś zacząć od drobnych spraw. W takim przypadku są dwa takie przypadki: is_power(x,x) i is_power(1,x) - w obu odpowiedziach jest True, ponieważ x**1==x i x**0==1.

Po uwzględnieniu tych przypadków wystarczy zapisać pozostałą część definicji. Napisz kod dla (a is divisible by b) and (a/b is a power of b) i włóż to wszystko razem.

Ostateczna funkcja będzie wyglądać następująco:

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> 

Jedynym pytaniem pozostaje to, jak odpowiedzieć <a/b is a power of b>. Najłatwiej to zrobić, używając samej funkcji - nazywa się rekurencją.

+0

To jest poprawna odpowiedź na problem, który próbuje rozwiązać, ale nie jest to odpowiedź na jego pytanie, które było pytaniem, co było nie tak z jego kodem, a nie jak pisać inny kod, który rozwiązuje problem. –

+0

Dobrze, dodałem trochę więcej wyjaśnień. –

0

Możesz użyć dziennika.

import math 

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

'math.log' może nie być stabilne liczbowo. –

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 

Warunek końcowy, który jest == b jest kluczowe tutaj, który zatrzymuje się, gdy obie liczby są równe. Jeśli ta funkcja nie jest włączona, funkcja może pokazać False nawet dla prawowitych liczb, dzieląc a/bw następnej iteracji, która daje 1, gdzie 1% b = 1, co z kolei zwraca False zamiast True.

+2

Postaraj się podać wyjaśnienie swojej odpowiedzi, zamiast podawać tylko blok kodu. Pomoże to innym użytkownikom zrozumieć odpowiedź zamiast korygować zlokalizowany problem. Dzięki! – Conner

+0

Powinieneś także obsłużyć przypadek, w którym 'b' wynosi zero, ale' a' nie jest, ponieważ wtedy 'a% b == 0' będzie rzutować i wyjątek dla dzielenia przez zero, którego nie przechwytujesz. – rbaleksandar

0

Jesteś odpowiadając na pierwsze ograniczenie, ale nie do drugiego,
Aby sprawdzić, że (a/b)%b == 0 która jest szczególnym przypadkiem „(a/b) is a power of b”. Nich błąd uogólnienie (spróbuj pomyśleć uogólniając, że konkretny przypadek

co napisałeś nie jest rozwiązaniem is power of na przykład można wskazać 12 jako potęgi 2 od:.

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

Ale to jest oczywiście błędne.

Jak powiedzieli inni, pomyśl o rekurencji (lub mniej korzystnym rozwiązaniu pętli).

0

Sam pracowałem nad tym pytaniem i to właśnie wymyśliłem.

Aby zapisać to jako funkcję rekurencyjną, potrzebujesz części rekurencyjnej i części trywialnej. Dla rekurencyjnego części, numer jest moc inny numer, jeżeli:

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

Dla trywialnym przypadku b jest potęgą a jeśli a=b.

Jednak nie skończyliśmy. Ponieważ dzielimy się przez b, musimy zrobić wyjątek, gdy b jest zero.

I innym wyjątkiem jest b = 1. Od kiedy b=1, a/b jest a, otrzymamy nieskończoną rekurencję.

więc wprowadzenie go wszystkie razem:

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

Ten przykład powinien rozwiązać problem:

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 dla kodu nadmiarowego. Część 'is_power (a/b, b) == True' jest zbędna. 'is_power (a/b, b)' już zwraca wartość boolowską. –

0

Oto moje rozwiązanie.

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 badane w wielu przypadkach (16,2), (6,2), (1,2), (0,0), (0,1) i jest dobrze.

0

znacznie prostsze rozwiązanie:

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

Rekurencja nie jest naprawdę potrzebne do tego problemu. Co więcej, wtopienie może spowodować błąd limitu rekursji, jeśli a = b ** 1001.

+0

Jaki jest cel tego oświadczenia? a // = b – Kris1511

Powiązane problemy