为什么我的递归函数使用if-elif语句返回None?

5 投票
7 回答
3046 浏览
提问于 2025-04-16 04:11

我现在正在努力学习Python,但在递归函数这块遇到了一些困难。在《Think Python》这本书里,有一个练习是让我们写一个函数,判断数字a是否是数字b的幂,定义如下:

“如果一个数字a可以被b整除,并且a/b也是b的幂,那么a就是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)

目前这个函数能给我想要的结果。但是这一章主要是讲如何写递归函数,以减少重复的代码,我不太确定怎么把最后的“(a/b) % b == 0”改成递归的形式。我尝试过:

def isPower(a,b):
    if a % b != 0:
        return False
    elif isPower((a/b),b):
        return True

但这个只返回了None。

那么,正确的递归写法应该是什么呢?

7 个回答

1

当然可以!请看下面的内容:

这个问题主要是关于如何在编程中处理一些特定的情况。很多时候,我们在写代码的时候,会遇到一些错误或者意外的情况,这时候就需要用到一些技巧来解决问题。

比如,有时候我们需要检查一个变量的值,看看它是否符合我们的预期。如果不符合,我们可能就需要采取一些措施,比如给用户提示,或者记录下这个错误,以便后续处理。

在编程中,处理这些情况的方式有很多种,通常我们会使用条件语句来判断,比如说“如果这个条件成立,就执行某个操作”。这样可以让我们的程序更加灵活,能够应对不同的情况。

总之,编程就像是在解决一个个小问题,掌握了这些技巧后,我们就能写出更稳定、更可靠的代码。

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

你需要再加一个情况,用来处理当两个条件都返回假(false)的情况。

def isPower(a,b):
    if a % b != 0:
        return False
    elif isPower((a/b),b):
        return True
    else
        return False
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

不过,这里还有其他问题——如果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)

编辑:我的代码在a和b都为负数的情况下不工作。我现在比较它们的绝对值。

编辑2:真是傻,我忘了x的0次方等于1,所以a等于1时应该总是返回真。这也意味着在递归之前我不需要比较a和b。谢谢@Javier。

撰写回答