问题
I'm currently trying to wrap my head around learning Python and I've come to a bit of a stall on recursive functions. In Think Python, one of the exercises is to write a function that determines if number a is a power of number b using the following definition:
"A number, a, is a power of b if it is divisible by b and a/b is a power of b. Write a function called is_power that takes parameters a and b and returns True if a is a power of b."
The current state of my function is:
def isPower(a,b):
return a % b == 0 and (a/b) % b == 0
print isPower(num1,num2)
As it is, this produces the result I expect. However the chapter is focused on writing recursive functions to reduce redundancy and I'm not quite sure how I can turn the final "(a/b) % b == 0" into a recursion. I've attempted:
def isPower(a,b):
if a % b != 0:
return False
elif isPower((a/b),b):
return True
But that just returns None.
What is the proper way to recurse this function?
回答1:
You are forgetting a base case, when a == 1:
def isPower(a,b):
if a == 1:
return True
if a % b != 0:
return False
elif isPower((a/b),b):
return True
else
return False
However this has some other problems - if a is 0 then it will never finish and if b is 0 then you will get a divide-by-zero.
Here is a verbose solution that as far as I can tell will work for all integer combinations:
def isPower(a,b):
if a == 0 or b == 0:
return False
def realIsPower(a, b):
if a == 1:
return True
elif a%b != 0:
return False
elif realIsPower((a/b), b):
return True
else:
return False
return realIsPower(a, b)
EDIT: My code didn't work for cases when both a and b are negative. I'm now comparing their absolute values.
EDIT2: Silly me, x^0 == 1, so a == 1 should ALWAYS return true. That also means I don't have to compare a to b before the recursion. Thanks @Javier.
回答2:
you need an additional case, for when both conditionals return false
def isPower(a,b):
if a % b != 0:
return False
elif isPower((a/b),b):
return True
else
return False
回答3:
def isPower (a,b):
return a==1 or (a!=0 and b!=0 and b!=1 and isPower((a/b),b))
回答4:
Here is my code. From what I tested, it works:
def ispower(a, b):
if b == 1 or b == 0:
return False
if b <= 0 or a <= 0:
return False
if a % b == 0:
if ((a / b) / b) == 1:
return True
else:
return ispower(a / b, b)
else:
return False
print ispower(-10, 2)
回答5:
try this,
def ispower(a,b):
if b==a:
return True
elif a<b:
return False
else:
return ispower(a*1.0/b, b)
回答6:
def is_power (a, b):
if a == 1:
return True
if a == 0 and b == 0:
return True
if a == 0 or b == 0:
return False
if a%b != 0:
return False
elif is_power ((a/b), b):
return True
回答7:
Here's my answer, it's a little bit cleaner:
def is_power(a, b):
if a == 1:
return True
if a == 0 or b == 0:
return False
if a % b == 0 and is_power(a/b, b):
return True
else:
return False
来源:https://stackoverflow.com/questions/3719853/why-does-my-recursive-function-return-none