我试图确定一个圆中晶格点的数量,即基本上我试图找到对的数量(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):
谢谢
最佳答案 正如您已经指出的那样,问题是您在圆的一个象限中计算格点.扩大范围以解决这个问题是一种方法;另一种解决方法是采取
lattice points = 4 * (lattice points in a single quadrant) - 3
我们必须减去3,因为第一项计算原点四次.
由于您已经发现了该错误,因此以下是一些关于改进代码的其他方法的快速评论:
> range()最多可以包含三个参数:start,end和step:
>如果仅提供两个参数,则默认步骤为1
>如果仅提供一个参数,则默认为从0开始,步骤为1
一般来说,你应该提供尽可能少的参数(让默认值完成其余的工作) – 这会减少视觉噪音.
所以在原始函数中,你会写
for m in range(int(N)):
在固定版本中,你写道:
for m in range(-int(N), int(N)):
>由于您的示例提供N作为整数,我不确定为什么您不断地转换为int().最好在函数开始时对int()执行单个强制转换,然后删除其余的强制转换.这将减少视觉噪音.
>提供的函数抛出NameError.它计算变量num中的格点,但返回数字,尚未定义.快速修复是整理return语句;更好的方法是使用更具描述性的变量名称,例如lattice_count.
另请注意,您可以将num = num 1替换为num = 1.
>如果m> sqrt(N)或n> sqrt(N),显然格点(m,n)将落在半径N的圆外.因此,你可以通过仅查看-sqrt(N)< = m< = sqrt来加速你的循环( N),同样适用于n.