【发布时间】:2019-05-07 20:14:06
【问题描述】:
在实现 pow(x, n), for (x=2,and n=-2147483648) 时,我收到以下错误:
代码:
class Solution:
def myPow(self, x, n):
flag = n < 0
n = -1 * n if flag else n
ans = None
if n % 2 == 0:
t = pow(x, n/2)
ans = t*t
else:
t = pow(x, (n-1)/2)
ans = x * t * t
return (1/ans) if flag else ans
if __name__ == "__main__":
Solution().myPow(2,-2147483648)
Traceback (most recent call last):
File "pw.py", line 16, in <module>
Solution().myPow(2,-2147483648)
File "pw.py", line 8, in myPow
t = pow(x, n/2)
OverflowError: (34, 'Numerical result out of range')
但是,当我将 n/2 和 (n-1)/2 类型转换为 int 如下代码 sn-p 时,我得到 0.0 作为输出:
class Solution:
def myPow(self, x, n):
flag = n < 0
n = -1 * n if flag else n
ans = None
if n % 2 == 0:
t = pow(x, int(n/2))
ans = t*t
else:
t = pow(x, int((n-1)/2))
ans = x * t * t
return (1/ans) if flag else ans
if __name__ == "__main__":
Solution().myPow(2,-2147483648)
我无法找出原因。这是由于stackoverflow,因为python解释器不处理尾递归优化,并且返回的结果被保留,因为它稍后用于进一步计算。
我很想知道为什么这两种情况不同。
【问题讨论】:
-
我认为错误不是由于 stackoverflow 而是由于 int 数据类型容纳大量数字的能力。
-
您忘记实现基本案例。当 n == 1 或 0 时会发生什么?
-
n/2 或赋值不太可能出错。您确定这是您的实际代码吗?我觉得这里少了点什么。也许我错过了什么?
-
@MadPhysicist 请注意,OP 正在递归调用内置的
pow而不是myPow- 可能是一个错字,但仍值得调查以供将来参考
标签: python-3.x algorithm recursion tail-recursion