我试图使用递归查找数字是否为2的幂。但是,我似乎无法找出正确的解决方案。到目前为止,这是我尝试过的方法:

def is_power(n):
    n = n/2
    if n == 2:
        return True
    elif n > 2:
        is_power(n)
    else:
        return False


if is_power(32):
    print 'yes'
else:
    print 'no'


由于'32'是2的幂,我希望我的代码返回'yes'作为输出。但是,代码改为输出“ no”。我的代码似乎有什么问题?

最佳答案

elif n > 2:
    is_power(n)


缺少return

def is_power(n):
    n = n/2
    if n == 2:
        return True
    elif n > 2:
        return is_power(n)
    else:
        return False


因此,is_power的“第一”级别不返回任何内容(或None,具体取决于您的检查方式),从而导致输出no

@kaveman正确指出is_power(2)会产生错误的结果。
您可以通过在elif子句中将2减半来解决此问题:

def is_power(n):
    if not n == int(n):
        return False
    n = int(n)
    if n == 1:
        return True
    elif n > 2:
        return is_power(n/2.0)
    else:
        return False


编辑:@will指出我正在将python2与python3部门混在一起。使用/2.0可以解决此问题。此外,在对问题的评论中,他指出1是2的幂。检查==1而不是==2可以解决此问题。另外,我添加了int强制转换,对于2的幂次幂是不必要的(因为好了,IEEE754浮点数毕竟是2的幂,所以2的幂次才是可以表示的),但是对于非2的幂,这将使代码可移植。

09-12 06:54