我一直在研究一个问题,以确定给定的整数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
我一直在研究一个问题,以确定给定的整数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
几件事:
这似乎是 Python2 代码(因为会在 Python3 中为所有奇数srange(1, n/2)
抛出 a )。您应该使用而不是Eric Appelt 在评论中建议的那样。在 Python2 中创建一个列表,当你真正需要一个生成器时。TypeError
n
xrange
range
range
i * i == n
您可以通过检查 if (or i**2 == n
)来减少您正在执行的操作的数量。然后你正在做一个乘法(或指数)和一个相等检查,而不是一个 mod、一个 floordiv 和两个相等检查。
如果你要走那么远,为什么不直接做def is_square(n): root = n**0.5; return int(root) == root
呢?你会发现很多“改进你的算法”都是利用数学而不是蛮力。
无关,没有理由i += 1
在for
循环内做。这就是for
循环的作用。