The Python Oracle

Why does my recursive function with if-elif statements return None?

Become part of the top 3% of the developers by applying to Toptal https://topt.al/25cXVn

--

Music by Eric Matyas
https://www.soundimage.org
Track title: Lost Meadow

--

Chapters
00:00 Question
01:21 Accepted answer (Score 3)
02:38 Answer 2 (Score 2)
02:55 Answer 3 (Score 1)
03:15 Answer 4 (Score 1)
03:25 Thank you

--

Full question
https://stackoverflow.com/questions/3719...

Question links:
[Think Python]: http://www.greenteapress.com/thinkpython/

--

Content licensed under CC BY-SA
https://meta.stackexchange.com/help/lice...

--

Tags
#python #recursion

#avk47



ACCEPTED ANSWER

Score 3


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.




ANSWER 2

Score 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



ANSWER 3

Score 1


def isPower (a,b):
    return a==1 or (a!=0 and b!=0 and b!=1 and isPower((a/b),b))



ANSWER 4

Score 0


try this,

def ispower(a,b):
  if b==a:
    return True
  elif a<b:
    return False
  else:
    return ispower(a*1.0/b, b)