[英]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.