我试图确定一个圆中的格点数,即基本上我试图找到对的数量(m,n),使得m ^ 2 + n ^ 2 <= r ^ 2,其中m和n都是整数。我使用下面的代码来做这个,但我得到了r = 12的错误答案,根据this应该是441我得到121而我想知道我可能在哪里错了:
def latticepoints(N):
num = 0
for m in range(0, int(N), 1):
for n in range(0, int(N), 1):
if (m**2 + n**2) <= N**2:
num = num + 1
return number
print(latticepoints(12))
修改:
刚刚解决了。只需要将循环更改为:
for m in range(-int(N), int(N)+1, 1):
for n in range(-int(N), int(N)+1, 1):
由于
答案 0 :(得分:2)
正如您已经指出的那样,问题是您在圆的一个象限中计算格点。扩大范围以解决这个问题是一种方法;另一种解决方法是采取
lattice points = 4 * (lattice points in a single quadrant) - 3
我们必须减去3,因为第一项计算原点四次。
由于您已经发现了该错误,因此以下是一些关于改进代码的其他方法的快速评论:
range()
最多可以包含三个参数:start,end和step:
一般情况下,你应该提供尽可能少的参数(让默认设置完成剩下的工作) - 这会减少视觉噪音。
所以在原始函数中,你要写
for m in range(int(N)):
在固定版本中,你会写:
for m in range(-int(N), int(N)):
由于您的示例将N提供为整数,因此我不确定为什么要继续转换为int()。最好在函数开始时对int()执行单个强制转换,然后删除其余的强制转换。这将减少视觉噪音。
提供的函数抛出NameError。它计算变量num
中的格点,但返回number
,尚未定义。快速修复是整理return语句;更好的方法是使用更具描述性的变量名称,例如lattice_count
。
另请注意,您可以num = num + 1
替换num += 1
。
如果m > sqrt(N)
或n > sqrt(N)
,格子点(m,n)显然会落在半径N的圆外。这样,你只需看一下就可以加速你的循环-sqrt(N) <= m <= sqrt(N)
,同样适用于n
。