为什么我的递归函数返回None?

bob*_*bby 5 python recursion

我目前正试图绕着学习Python来解决问题,而且我对递归函数有点拖延.在Think Python中,其中一个练习是编写一个函数,使用以下定义确定数字a是否是数字b的幂:

"数字a是b的幂,如果它可被b整除,a/b是b的幂.写一个叫做is_power的函数,它接受参数a和b,如果a是b的幂,则返回True."

我的功能的当前状态是:

def isPower(a,b):
    return a % b == 0 and (a/b) % b == 0

print isPower(num1,num2)
Run Code Online (Sandbox Code Playgroud)

实际上,这会产生我期望的结果.然而本章的重点是编写递归函数以减少冗余,我不太确定如何将最终的"(a/b)%b == 0"转换为递归.我试过了:

def isPower(a,b):
    if a % b != 0:
        return False
    elif isPower((a/b),b):
        return True
Run Code Online (Sandbox Code Playgroud)

但那只是返回无.

递归这个函数的正确方法是什么?

Nik*_*chi 3

当 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
Run Code Online (Sandbox Code Playgroud)

然而,这还有一些其他问题 - 如果 a 是 0 那么它永远不会完成,如果 b 是 0 那么你将得到被零除的结果。

据我所知,这是一个详细的解决方案,适用于所有整数组合:

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)
Run Code Online (Sandbox Code Playgroud)

编辑:我的代码不适用于 a 和 b 均为负数的情况。我现在正在比较它们的绝对值。

EDIT2:愚蠢的我,x^0 == 1,所以 a == 1 应该总是返回 true。这也意味着我不必在递归之前比较 a 和 b。谢谢@哈维尔。