如何解决为什么我的while循环在中断后会再执行一次?
我仍在学习如何编写适当的while循环。这个迷你练习要求编写一个while循环,该循环查找小于整数限制的最大平方数,并将其存储在一个名为Nearest_square的变量中。平方数是整数乘以自身的乘积。例如,36是一个平方数,因为它等于6 * 6。如果限制设置为40,则您的代码应将Nearest_square设置为36。
所以我首先这样编写代码:
limit = 40
n=1
nearest_square = 1
while nearest_square < limit:
nearest_square = n**2
n += 1
print(nearest_square)
输出为:
49
我不知道为什么n没有在6而是7打破。
limit = 40
n=1
nearest_square = 1
while n**2 < limit:
nearest_square = n**2
n += 1
print(nearest_square)
这次输出为36。
我不知道while循环何时中断以及为什么在第一个代码块中,n在7处结束并再次返回到循环,并且即使49已经大于40,也要计算49的Nearest_square。
解决方法
我不知道为什么n没有在6而是7折断
让我们从n=6
手动进行迭代,
n = 6
while nearest_square < limit: ## 25 < 40 (25,nearest_square calculated when n=5)
nearest_square = n**2 ## nearest_square = 6**2 => 36
n += 1 ## n =7
n = 7
while nearest_square < limit: ## 36 < 40 (36,nearest_square calculated when n=6)
nearest_square = n**2 ## nearest_square = 7**2 => 49
n += 1 ## n = 8
n = 8
while nearest_square < limit: ## 49 < 40 (49,nearest_square calculated when n=7)
exit ## since condition is not met
在第一种情况下,您要检查的是先前nearest_square
的{{1}},而不是当前的n
如@tdelaney所述,您也可以在n
内添加一个if
。
在您的第一种情况下,检查nearest_square
以查看while
循环是否应该继续,但是仅在while
之后的n
循环的下一次迭代中进行更新已增加,因此在n
达到7之后,程序检查nearest_square
的值,发现它仍然是36,因为程序尚未更新它,因此更改了nearest_square
到49,然后n
到8,然后再停止。在第二种情况下,程序将在更改n*n>40
的值之前检查是否nearest_square
。
第一个循环中的问题是,超出限制后会中断。当您真正想要计算之前,就得到了49。您需要保留先前的值,或者像第二个示例一样进行两次计算。由于计算成本低廉,因此两者都可以。但是更普遍地,跟踪先前的值更为常见。
由于您的计数可以由range
处理,因此可以是for
循环。
limit = 40
nearest_square = 1
for n in range(1,40):
next_square = n**2
if next_square >= limit:
break
nearest_square = next_square
print(nearest_square)
,
原因是,在第一个循环中,nearest_square
仍对应6**2
,尽管n=7
在while
决定是否再次执行该块时。请注意,在将n
存储在n**2
中之后,您需要增加nearest_square
的值。
一个变量的更改不会自动转移到使用先前调用创建的其他变量。
while
循环中的这类“一举成名”问题很难发现,因此不要气disc!
发生这种情况是因为首先检查它,然后才对它求平方。
将其更改为:
limit = 40
n=1
nearest_square = 1
while n**2 < limit:
nearest_square = n**2
n += 1
print(nearest_square)
它会在实际平方之前检查平方和。
另一种解决方案是:
n=1
while (n + 1) ** 2 < limit:
n += 1
print(n ** 2)
很好的解决问题的方法:)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。