python - 我的 for 循环随机卡住并且没有完成它的范围
问题描述
我的 for 循环一直停在 main 中。它应该调用 def binarySearch 10000 次并将每次尝试的猜测总数相加。我注意到当我将范围降低到 100 时,for 循环大部分时间都在工作。它有时仍然只是冻结并且从不打印任何内容。
import random
def binarySearch(left, right, x):
counter = 0 #guesses per try
while left <= right:
counter+=1
mid = (right + left) // 2
if x == mid:
return counter
elif x > mid:
left = mid
elif x < mid:
right = mid
def main():
guesses = 0 # total number of guesses
###Problem here###
for x in range(10001):
lef = 0 #min
rig = 1000 #max
num = random.randint(lef, rig) #random number
guesses += binarySearch(lef, rig, num) #calls binarySearch and sums the total guesses
print("Total guesses from 10000 tries: ", guesses)
main()
编辑:我将问题缩小到:
elif x < 中:左 = 中
我对其进行了多次测试,得出的结论是,while 循环最终会卡住重复 else if 语句。我不知道为什么会这样。
解决方案
它卡住的原因是边界条件有错误。如果数不等于mid,左右应该分别等于mid + 1
and mid - 1
。无需再考虑中间。由于您一次又一次地考虑 mid ,因此您的状况永远不会脱离这个循环,因此是无限循环。
elif x > mid:
left = mid + 1
elif x < mid:
right = mid - 1
这些应该是您对左右的新值。无需再次考虑 mid,因为它不等于目标值,如果是,则如果条件为真,则为最高。
推荐阅读
- r - 如何在R中的正则表达式中匹配斜体和下划线
- symfony - 更新实体 Symfony 2.6
- compilation - 如果我只是在编写 clojurescript 实用程序函数,是否需要 cljsbuild 插件?
- jquery - 无法将 Json 数据加载到下拉列表
- nginx - 在谷歌入口控制器中建立 https 后 websocket 连接失败
- javascript - 导航悬停效果wordpress
- cmake - 如何根据生成器表达式 CONFIG 而不是 CMAKE_BUILD_TYPE 添加_子目录?
- reactjs - react-dates,当用户点击结束日期对应的输入字段时,应该显示结束日期对应的月份
- mongodb - 在不聚合的查找查询中获取 Mongo _id 作为字符串而不是 ObjectId
- java - 404 未找到 Tomcat 的 Spring Boot 战争