【发布时间】:2010-09-15 16:46:49
【问题描述】:
我目前正忙于学习 Python,但在递归函数方面遇到了一些障碍。在Think Python 中,其中一个练习是编写一个函数,使用以下定义确定数字 a 是否是数字 b 的幂:
"一个数a是b的幂,如果它可以被b整除,a/b是b的幂。编写一个名为is_power的函数,接受参数a和b,如果a是a的幂则返回True b.”
我的函数的当前状态是:
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
但这只是返回无。
递归这个函数的正确方法是什么?
【问题讨论】:
-
您应该注意,'/' 运算符的含义在 Python 3+ 中发生了变化,从返回整数变为返回浮点数,因此您的代码会中断。将其更改为 '//' ,这将始终返回一个 int。
-
请注意,您的第一次尝试不会检查 a 是否是 b 的幂,它会检查 a 是否是 b^2 的倍数。试试 isPower(12,2),它会返回 True。
-
据说,你的第一个版本的 isPower 坏了——它只会显示
a是否是b^2的倍数。例如,对于isPower(2, 1),它将返回 true,这绝不应该是 true。就此而言,您可能希望确保任何递归版本在继续之前检查(b==1 && a!=1),否则它将陷入无限循环或返回错误的内容。