我一直在研究一个问题,以确定给定的整数n
是否是完美的正方形。虽然该算法有效,但我得到MemoryError
。我应该如何重新编写这个代码?
提前致谢。
def is_square(n):
for i in range(1, (n/2)):
i += 1
if n % i == 0 and n // i == i:
return True
return False
答案 0 :(得分:3)
一些事情:
这似乎是Python2代码(因为range(1, n/2)
会在Python3中为所有奇数TypeError
s抛出n
。您应该使用xrange
代替range
,正如Eric Appelt在评论中所建议的那样。当你真的需要一个生成器时,Python2中的range
会创建一个列表。
您可以通过检查i * i == n
(或i**2 == n
)来减少您正在执行的操作次数。然后你进行一次乘法(或指数)和一次等式检查,而不是一次mod,一次floordiv和两次相等检查。
如果你走得那么远,为什么不做def is_square(n): root = n**0.5; return int(root) == root
?您会发现很多"改进您的算法"正在利用数学而不是蛮力。
无关,没有理由在i += 1
循环中执行for
。这就是for
循环的作用。