繁体   English   中英

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

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

我目前正在努力学习 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)

事实上,这产生了我期望的结果。 然而,本章的重点是编写递归函数以减少冗余,我不太确定如何将最终的“(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 进行比较。 谢谢@Javier。

您需要一个额外的案例,因为当两个条件都返回 false 时

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

这是我的代码。 根据我的测试,它有效:

def ispower(a, b):

    if b == 1 or b == 0:
        return False
    if b <= 0 or a <= 0:
        return False
    if a % b == 0:
        if ((a / b) / b) == 1:
            return True
        else:
            return ispower(a / b, b)
    else:
        return False
        print ispower(-10, 2)
def isPower (a,b):
    return a==1 or (a!=0 and b!=0 and b!=1 and isPower((a/b),b))
def is_power (a, b):

    if a == 1:
        return True
    if a == 0 and b == 0:
        return True
    if a == 0 or b == 0:
        return False
    if a%b != 0:
        return False
    elif is_power ((a/b), b):
        return True

这是我的答案,它更简洁一点:

def is_power(a, b):
    if a == 1:
        return True
    if a == 0 or b == 0:
        return False
    if a % b == 0 and is_power(a/b, b):
        return True
    else:
        return False

试试这个,

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM