当前位置: 首页 > 面试题库 >

为什么带有if-elif语句的递归函数返回None?

杨良才
2023-03-14
问题内容

目前,我正在努力学习Python,而在递归函数方面却陷入了停滞。在Think
Python中
,练习之一是编写一个函数,该函数使用以下定义来确定
a 是否为 b 的幂:

“如果a被b整除,则a是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)

实际上,这产生了我期望的结果。但是,本章着重于编写递归函数以减少冗余,并且我不确定如何将最终的“(a / b)%b == 0”转换为递归。我尝试过:

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

但这只会返回None。

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


问题答案:

当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均为负的情况。我现在正在比较它们的绝对值。

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



 类似资料:
  • 我不得不使用全局变量found来指示在哪里找到了一个和。返回语句始终未定义。 此外,如果在下面的if语句中使用return语句,代码将无法正常工作。 这不是问题的最佳解决方案,但这是我得到的工作版本。 返回语句之间的****,删除时代码工作,否则我要么得到false或未定义。我不明白这部分!为什么删除返回就能解决问题,我认为每个递归调用都必须用返回语句进行。 问题可能是由于多次呼叫造成的吗?我是不

  • 问题内容: 我试图获得一个if语句从多个条件中触发,而不用不同的触发器多次重写该语句。例如: 您如何将这些内容浓缩成一个陈述? 我试过使用“或”,并且无论输入是否符合任何条件,它都会导致任何raw_input触发语句。 问题答案: 你想做的是 如果您有很多可能性,请选择另一个选项: 由于您使用的是2.7,因此您也可以这样编写(在2.7或3+版本中有效,但在2.6或以下版本中无效): 这使元素成为您

  • 问题内容: 我有一个自称的函数: 现在,如果我只输入,则一切正常: 但是,如果我输入其他内容,然后输入 ,则会得到以下信息: 我不知道为什么要回来,因为它应该只回来。这None是哪里来的,我该如何修复我的功能? 问题答案: 之所以返回,是None因为当你递归调用它时: ..你不返回该值。 因此,当确实发生递归时,返回值将被丢弃,然后你就无法使用该函数了。退出函数的末尾意味着隐式返回None,就像这

  • 我有一个if语句,它递归地调用自己在二叉查找树中查找值。 当我试图编译程序时,它会因为结尾没有return语句而感到不安。程序最终应该命中一个return语句,但为了使其编译,我在最后添加了一个return语句。但是程序总是从该语句返回,即使它在else-if语句中表示to。我知道它到达了那个语句,但我不知道为什么它没有从那个语句中返回。

  • 问题内容: 我编写了以下函数,以实现自己的二进制搜索 我知道我的实现已经关闭,但是我对理解递归堆栈更加好奇。 当我调用时,我的函数应返回的值 但相反,它返回None。此外,当我直接调用时 ,我得到的正确值为0。这怎么可能? 问题答案: 您将忽略递归调用的返回值。您还需要 显式地 返回它们: 递归调用与其他任何函数调用一样;他们将结果返回给调用者。如果忽略返回值,然后调用函数结束,那么您将以该调用函

  • 很抱歉问了一个关于已经讨论过很多次的论点的非常基本的问题,我就是想不出答案。我试着在论坛上搜索已经在主题上提出的问题,但没有找到确切的答案(或者不理解)。 当以不同顺序调用时,为什么此函数会打印两次从i到10的数字?它不应该按同样的顺序打印出来吗?我一直听说递归就是这样工作的:每个函数在其代码中调用另一个相同的函数,只应用于较小的域,直到满足结束条件为止。此时,它应该返回(回溯)到原始函数;这就是